Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我
所有文章 外链

Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我

cocoa基础

阅读数:次 2017-05-11
字数统计: 5.7k字   |   阅读时长≈ 29分

类别的使用例子

1
2
3
4
5
6
7
8
9
10
11
12
#import "Roommate.h"
@interface Roommate (Roommate_Say)
-(void) introduceSelf;
//-(void)hello:(NSString *) str;
@end

#import "Roommate+Roommate_Say.h"
@implementation Roommate (Roommate_Say)
-(void) introduceSelf{
NSLog(@"my name is liuyanwei");
}
@end

协议的使用例子

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>
@protocol RoommateDelegate<NSObject>
@optional
-(void)showMessage:(NSString *)msg;
@required
-(void)mustShowMessage:(NSString *)msg;
@end

block的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

--1基本用法
void(^myblock)(NSString *msg) = ^(NSString *msg){
NSLog(@"%@",msg);
};
myblock(@"hello");

--2先定义在类方法中后使用
//方法定义
-(void)showMessageWithBlock:(NSString *) msg block:(void (^)(NSString *msg))block
{
block(msg);
}

//方法定义的简写
typedef void (^ShowMessageBlock)(NSString *msg);
-(void)showMessageWithBlock1:(NSString *) msg block:(ShowMessageBlock)block{
block(msg);
}
//方法的使用
[roommate showMessageWithBlock:@"hello" block:^(NSString *msg) {
NSLog(@"%@",msg);
}];

--3 注意点
若想在block中修改本地变量,需要声明变量类型: __block NSString *localmsg = @"local string";

结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*NSRange表示一个范围*/
void test1(){
NSRange rg={3,5};//第一参数是起始位置第二个参数是长度
//NSRange rg;
//rg.location=3;
//rg.length=5;
//NSRange rg={.location=3,.length=5};
//常用下面的方式定义 NSRange rg2=NSMakeRange(3,5);//使用NSMakeRange定义一个NSRange
//打印NSRange可以使用Foundation中方法 NSLog(@"rg2 is %@", NSStringFromRange(rg2));//注意不能直接NSLog(@"rg2 is %@", rg2),因为rg2不是对象(准确的说%@是指针)而是结构体
}
/*NSPoint表示一个点*/
void test2(){
NSPoint p=NSMakePoint(10, 15);//NSPoint其实就是CGPoint
//这种方式比较常见 NSPoint p2=CGPointMake(10, 15);
NSLog(NSStringFromPoint(p2));
}
/*NSSize表示大小*/
void test3(){
NSSize s=NSMakeSize(10, 15);//NSSize其实就是CGSize
//这种方式比较常见 CGSize s2=CGSizeMake(10, 15);
NSLog(NSStringFromSize(s2));
}
/*NSRect表示一个矩形*/
void test4(){
NSRect r=NSMakeRect(10, 5, 100, 200);//NSRect其实就是CGRect
//这种方式比较常见 NSRect r2=CGRectMake(10, 5, 100, 200);
NSLog(NSStringFromRect(r2));
}


日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281

NSDate *date1=[NSDate date];//获得当前日期
NSLog(@"%@",date1); //结果:2014-07-16 07:25:28 +0000

NSDate *date2=[NSDate dateWithTimeIntervalSinceNow:100];//在当前日期的基础上加上100秒,注意在ObjC中多数时间单位都是秒
NSLog(@"%@",date2); //结果:2014-07-16 07:27:08 +0000

NSDate *date3=[NSDate distantFuture];//随机获取一个将来的日期
NSLog(@"%@",date3); //结果:4001-01-01 00:00:00 +0000

NSTimeInterval time=[date2 timeIntervalSinceDate:date1];//日期之差,返回单位为秒
NSLog(@"%f",time); //结果:100.008833

NSDate *date5=[date1 earlierDate:date3];//返回比较早的日期
NSLog(@"%@",date5); //结果:2014-07-16 07:25:28 +0000

//日期格式化
NSDateFormatter *formater1=[[NSDateFormatter alloc]init];
formater1.dateFormat=@"yy-MM-dd HH:mm:ss";
NSString *datestr1=[formater1 stringFromDate:date1];
NSLog(@"%@",datestr1); //结果:14-07-16 15:25:28
//字符串转化为日期
NSDate *date6=[formater1 dateFromString:@"14-02-14 11:07:16"];
NSLog(@"%@",date6); //结果:2014-02-14 03:07:16 +0000


````objc


## 字符串

````objc

/**字符串操作*/
void test1(){
char *str1="C string";//这是C语言创建的字符串
NSString *str2=@"OC string";//ObjC字符串需要加@,并且这种方式创建的对象不需要自己释放内存

//下面的创建方法都应该释放内存
NSString *str3=[[NSString alloc] init];
str3=@"OC string";
NSString *str4=[[NSString alloc] initWithString:@"Objective-C string"];
NSString *str5=[[NSString alloc] initWithFormat:@"age is %i,name is %.2f",19,1.72f];
NSString *str6=[[NSString alloc] initWithUTF8String:"C string"];//C语言的字符串转换为ObjC字符串

//以上方法都有对应静态方法(一般以string开头),不需要管理内存(系统静态方法一般都是自动释放)
NSString *str7=[NSString stringWithString:@"Objective-C string"];
}
void test2(){
NSLog(@"\"Hello world!\" to upper is %@",[@"Hello world!" uppercaseString]);
//结果:"Hello world!" to upper is HELLO WORLD!
NSLog(@"\"Hello world!\" to lowwer is %@",[@"Hello world!" lowercaseString]);
//结果:"Hello world!" to lowwer is hello world!

//首字母大写,其他字母小写
NSLog(@"\"Hello world!\" to capitalize is %@",[@"Hello world!" capitalizedString]);
//结果:"Hello world!" to capitalize is Hello World!

BOOL result= [@"abc" isEqualToString:@"aBc"];
NSLog(@"%i",result);
//结果:0
NSComparisonResult result2= [@"abc" compare:@"aBc"];//如果是[@"abc" caseInsensitiveCompare:@"aBc"]则忽略大小写比较
if(result2==NSOrderedAscending){
NSLog(@"left<right.");
}else if(result2==NSOrderedDescending){
NSLog(@"left>right.");
}else if(result2==NSOrderedSame){
NSLog(@"left=right.");
}
//结果:left>right.
}
void test3(){
NSLog(@"has prefix ab? %i",[@"abcdef" hasPrefix:@"ab"]);
//结果:has prefix ab? 1
NSLog(@"has suffix ab? %i",[@"abcdef" hasSuffix:@"ef"]);
//结果:has suffix ab? 1
NSRange range=[@"abcdefabcdef" rangeOfString:@"cde"];//注意如果遇到cde则不再往后面搜索,如果从后面搜索或其他搜索方式可以设置第二个options参数
if(range.location==NSNotFound){
NSLog(@"not found.");
}else{
NSLog(@"range is %@",NSStringFromRange(range));
}
//结果:range is {2, 3}
}
//字符串分割
void test4(){
NSLog(@"%@",[@"abcdef" substringFromIndex:3]);//从第三个索引开始(包括第三个索引对应的字符)截取到最后一位
//结果:def
NSLog(@"%@",[@"abcdef" substringToIndex:3]);////从0开始截取到第三个索引(不包括第三个索引对应的字符)
//结果:abc
NSLog(@"%@",[@"abcdef" substringWithRange:NSMakeRange(2, 3)]);
//结果:cde
NSString *str1=@"12.abcd.3a";
NSArray *array1=[str1 componentsSeparatedByString:@"."];//字符串分割
NSLog(@"%@",array1);
/*结果:
(
12,
abcd,
3a
)
*/

}
//其他操作
void test5(){
NSLog(@"%i",[@"12" intValue]);//类型转换
//结果:12
NSLog(@"%zi",[@"hello world,世界你好!" length]);//字符串长度注意不是字节数
//结果:17
NSLog(@"%c",[@"abc" characterAtIndex:0]);//取出制定位置的字符
//结果:a
const char *s=[@"abc" UTF8String];//转换为C语言字符串
NSLog(@"%s",s);
//结果:abc
}

int main(int argc, const char * argv[]) {
test1();
test2();
test3();
test4();
test5();
return 0;
}
/*可变字符串,注意NSMutableString是NSString子类*/
//注意虽然initWithCapacity分配字符串大小,但是不是绝对的不可以超过此范围,声明此变量对性能有好处
NSMutableString *str1= [[NSMutableString alloc] initWithCapacity:10];
[str1 setString:@"hello"];//设置字符串
NSLog(@"%@",str1);
//结果:hello

[str1 appendString:@",world!"];//追加字符串
NSLog(@"%@",str1);
//结果:hello,world!

[str1 appendFormat:@"我的年龄是%i。dear,I love you.",18];
NSLog(@"%@",str1);
//结果:hello,world!我的年龄是18。dear,I love you.

//替换字符串
NSRange range=[str1 rangeOfString:@"dear"];
[str1 replaceCharactersInRange:range withString:@"Honey"];
NSLog(@"%@",str1);
//结果:hello,world!我的年龄是18。Honey,I love you.

//插入字符串
[str1 insertString:@"My name is Kenshin." atIndex:12];
NSLog(@"%@",str1);
//结果:hello,world!My name is Kenshin.我的年龄是18。Honey,I love you.

//删除指定字符串
[str1 deleteCharactersInRange:[str1 rangeOfString:@"My name is Kenshin."]];//删除指定范围的字符串
NSLog(@"%@",str1);
//结果:hello,world!我的年龄是18。Honey,I love you.


````

## 数组

````objc

//NSArray长度不可变所以初始化的时候就赋值,并且最后以nil结尾
//此外需要注意NSArray不能存放C语言的基础类型
NSObject *obj=[[NSObject alloc]init];
//NSArray *array1=[[NSArray alloc] initWithObjects:@"abc",obj,@"cde",@"opq", nil];
NSArray *array1=[NSArray arrayWithObjects:@"abc",obj,@"cde",@"opq",@25, nil];
NSLog(@"%zi",array1.count);//数组长度,结果:5
NSLog(@"%i",[array1 containsObject:@"cde"]);//是否包含某个对象,结果:1
NSLog(@"%@",[array1 lastObject]);//最后一个对象,结果:25
NSLog(@"%zi",[array1 indexOfObject:@"abc"]);//对象所在的位置:0

Person *person1=[Person personWithName:@"Kenshin"];
Person *person2=[Person personWithName:@"Kaoru"];
Person *person3=[Person personWithName:@"Rosa"];
NSArray *array2=[[NSArray alloc]initWithObjects:person1,person2,person3, nil];
[array2 makeObjectsPerformSelector:@selector(showMessage:) withObject:@"Hello,world!"];//执行所有元素的showMessage方法,后面的参数最多只能有一个
/*结果:
My name is Kenshin,the infomation is "Hello,world!".
My name is Kaoru,the infomation is "Hello,world!".
My name is Rosa,the infomation is "Hello,world!".
*/
}
//数组的遍历
void test2(){
NSObject *obj=[[NSObject alloc]init];
NSArray *array=[[NSArray alloc] initWithObjects:@"abc",obj,@"cde",@"opq",@25, nil];
//方法1
for(int i=0,len=array.count;i<len;++i){
NSLog(@"method1:index %i is %@",i,[array objectAtIndex:i]);
}
/*结果:
method1:index 0 is abc
method1:index 1 is <NSObject: 0x100106de0>
method1:index 2 is cde
method1:index 3 is opq
method1:index 4 is 25
*/


//方法2
for(id obj in array){
NSLog(@"method2:index %zi is %@",[array indexOfObject:obj],obj);
}
/*结果:
method2:index 0 is abc
method2:index 1 is <NSObject: 0x100602f00>
method2:index 2 is cde
method2:index 3 is opq
method2:index 4 is 25
*/


//方法3,利用代码块方法
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"method3:index %zi is %@",idx,obj);
if(idx==2){//当idx=2时设置*stop为YES停止遍历
*stop=YES;
}
}];
/*结果:
method3:index 0 is abc
method3:index 1 is <NSObject: 0x100106de0>
method3:index 2 is cde
*/


//方法4,利用迭代器
//NSEnumerator *enumerator= [array objectEnumerator];//获得一个迭代器
NSEnumerator *enumerator=[array reverseObjectEnumerator];//获取一个反向迭代器
//NSLog(@"all:%@",[enumerator allObjects]);//获取所有迭代对象,注意调用完此方法迭代器就遍历完了,下面的nextObject就没有值了
id obj2=nil;
while (obj2=[enumerator nextObject]) {
NSLog(@"method4:%@",obj2);
}
/*结果:
method4:25
method4:opq
method4:cde
method4:<NSObject: 0x100106de0>
method4:abc
*/
}
//数组派生出新的数组
void test3(){
NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3", nil];
NSArray *array2=[array arrayByAddingObject:@"4"];//注意此时array并没有变
NSLog(@"%@",array2);
/*结果:
(
1,
2,
3,
4
)
*/


NSLog(@"%@",[array2 arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"5",@"6", nil]]);//追加形成新的数组
/*结果:
(
1,
2,
3,
4,
5,
6
)
*/


NSLog(@"%@",[array2 subarrayWithRange:NSMakeRange(1, 3)]);//根据一定范围取得生成一个新的数组
/*结果:
(
2,
3,
4
)
*/

字典的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

void test1(){
NSDictionary *dic1=[NSDictionary dictionaryWithObject:@"1" forKey:@"a"];
NSLog(@"%@",dic1);
/*结果:
{
a = 1;
}
*/

//常用的方式
NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys:
@"1",@"a",
@"2",@"b",
@"3",@"c",
nil];
NSLog(@"%@",dic2);
/*结果:
{
a = 1;
b = 2;
c = 3;
}
*/


NSDictionary *dic3=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"2", nil] forKeys:[NSArray arrayWithObjects:@"a",@"b", nil]];
NSLog(@"%@",dic3);
/*结果:
{
a = 1;
b = 2;
}
*/


//更简单的方式
NSDictionary *dic4=@{@"1":@"a",@"2":@"b",@"3":@"c"};
NSLog(@"%@",dic4);
/*结果:
{
1 = a;
2 = b;
3 = c;
}
*/
}
//遍历1
for (id key in dic1) {//注意对于字典for遍历循环的是key
NSLog(@"%@=%@",key,[dic1 objectForKey:key]);
}
/*结果:
d=2
b=2
c=3
a=1
*/

//遍历2
NSEnumerator *enumerator=[dic1 keyEnumerator];//还有值的迭代器[dic1 objectEnumerator]
id key=nil;
while (key=[enumerator nextObject]) {
NSLog(@"%@=%@",key,[dic1 objectForKey:key]);

}
/*结果:
d=2
b=2
c=3
a=1
*/

//遍历3
[dic1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@=%@",key,obj);
}];
/*结果:
d=2
b=2
c=3
a=1
*/

装箱拆箱

基本类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
+(NSNumber *)numberWithChar:(char)value;

+(NSNumber *)numberWithInt:(int)value;

+(NSNumber *)numberWithFloat:(float)value;

+(NSNumber *)numberWithDouble:(double)value;

+(NSNumber *)numberWithBool:(BOOL)value;

+(NSNumber *)numberWithInteger:(NSInteger)value;

拆箱的过程就更加简单了,可以调用如下方法:

-(char)charValue;

-(int)intValue;

-(float)floatValue;

-(double)doubleValue;

-(BOOL)boolValue;

复杂类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

+(NSValue *)valueWithPoint:(NSPoint)point;

+(NSValue *)valueWithSize:(NSSize)size;

+(NSValue *)valueWithRect:(NSRect)rect;

对应的拆箱方法:

-(NSPoint)pointValue;

-(NSSize)sizeValue;

-(NSRect)rectValue;

结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
示例
typedef struct {
int year;
int month;
int day;
} Date;

##使用:

## 选项 NS_OPTIONS

//NS_OPTIONS,定义选项
typedef NS_OPTIONS(NSUInteger, MyOption) {
MyOptionNone = 0, //二进制0000,十进制0
MyOption1 = 1 << 0,//0001,1
MyOption2 = 1 << 1,//0010,2
MyOption3 = 1 << 2,//0100,4
MyOption4 = 1 << 3,//1000,8
};

//声明定义枚举变量
MyOption option = MyOption1 | MyOption2;//0001 | 0010 = 0011,3

//检查是否包含某选型
if ( option & MyOption3 ){ //0011 & 0100 = 0000
//包含MyOption3
}else{
//不包含MyOption3
}

```

//增加选项:
option = option | MyOption4;//0011 | 1000 = 1011, 11
//减少选项
option = option & (~MyOption4);//1011 & (~1000) = 1011 & 0111 = 0011, 3

//NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体
void test1(){
//如果我们自己定义的结构体包装
Date date={2014,2,28};
char *type=@encode(Date);
NSValue *value=[NSValue value:&date withObjCType:type];//第一参数传递结构体地址,第二个参数传递类型字符串
NSArray *array=[NSArray arrayWithObject:value];
NSLog(@"%@",array2);
/*结果:
(
"<de070000 02000000 1c000000>"
)
*/

Date date2;
[value getValue:&date];//取出对应的结构体,注意没有返回值
//[value3 objCType]//取出包装内容的类型
NSLog(@"%i,%i,%i",date2.year,date2.month,date2.day); //结果:2014,2,28

}

反射

基本方法

1
2
3
4
5
6
7
8
9
10
11

NSLog(@"%i",[person1 isKindOfClass:[NSObject class]]); //判断一个对象是否为某种类型(如果是父类也返回YES),结果:1
NSLog(@"%i",[person1 isMemberOfClass:[NSObject class]]); //判断一个对象是否是某个类的实例化对象,结果:0
NSLog(@"%i",[person1 isMemberOfClass:[Person class]]); //结果:1
NSLog(@"%i",[person1 conformsToProtocol:@protocol(NSCopying)]);//是否实现了某个协议,结果:0
NSLog(@"%i",[person1 respondsToSelector:@selector(showMessage:)]);//是否存在某个方法,结果:1
//直接调用一个方法
[person1 showMessage:@"Hello,world!"];
//动态调用一个方法,注意如果有参数那么参数类型只能为ObjC对象,并且最多只能有两个参数
[person1 performSelector:@selector(showMessage:) withObject:@"Hello,world!"];

动态生成一个类

1
Class myClass=NSClassFromString(@"Person");//根据类名生成类

文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257

/*目录操作*/
void test1(){
//文件管理器是专门用于文件管理的类
NSFileManager *manager=[NSFileManager defaultManager];

//获得当前程序所在目录(当然可以改变)
NSString *currentPath=[manager currentDirectoryPath];
NSLog(@"current path is :%@",currentPath);
//结果:/Users/kenshincui/Library/Developer/Xcode/DerivedData/FoundationFramework-awxjohcpgsqcpsanqofqogwbqgbx/Build/Products/Debug

//创建目录
NSString *myPath=@"/Users/kenshincui/Desktop/myDocument";
BOOL result= [manager createDirectoryAtPath:myPath withIntermediateDirectories:YES attributes:nil error:nil];
if(result==NO){
NSLog(@"Couldn't create directory!");
}

//目录重命名,如果需要删除目录只要调用removeItemAtPath:<#(NSString *)#> error:<#(NSError **)#>
NSError *error;
NSString *newPath=@"/Users/kenshincui/Desktop/myNewDocument";
if([manager moveItemAtPath:myPath toPath:newPath error:&error]==NO){
NSLog(@"Rename directory failed!Error infomation is:%@",error);
}

//改变当前目录
if([manager changeCurrentDirectoryPath:newPath]==NO){
NSLog(@"Change current directory failed!");
}
NSLog(@"current path is :%@",[manager currentDirectoryPath]);
//结果:current path is :/Users/kenshincui/Desktop/myNewDocument

//遍历整个目录
NSString *path;
NSDirectoryEnumerator *directoryEnumerator= [manager enumeratorAtPath:newPath];
while (path=[directoryEnumerator nextObject]) {
NSLog(@"%@",path);
}
/*结果:
documents
est.txt
*/

//或者这样遍历
NSArray *paths= [manager contentsOfDirectoryAtPath:newPath error:nil];
NSObject *p;
for (p in paths) {
NSLog(@"%@",p);
}
/*结果:
documents
est.txt
*/
}

/*文件操作*/
void test2(){
NSFileManager *manager=[NSFileManager defaultManager];
NSString *filePath=@"/Users/kenshincui/Desktop/myNewDocument/test.txt";
NSString *filePath2=@"/Users/kenshincui/Desktop/test.txt";
NSString *newPath=@"/Users/kenshincui/Desktop/myNewDocument/test2.txt";

//判断文件是否存在,这个方法也可以判断目录是否存在,这要后面的参数设置位YES
if ([manager fileExistsAtPath:filePath isDirectory:NO]) {
NSLog(@"File exists!");
}

//文件是否可读
if([manager isReadableFileAtPath:filePath]){
NSLog(@"File is readable!");
}

//判断两个文件内容是否相等
if ([manager contentsEqualAtPath:filePath andPath:filePath2]) {
NSLog(@"file1 equals file2");
}

//文件重命名,方法类似于目录重命名
if (![manager moveItemAtPath:filePath toPath:newPath error:nil]) {
NSLog(@"Rename file1 failed!");
}

//文件拷贝
NSString *filePath3=@"/Users/kenshincui/Desktop/test3.txt";
if(![manager copyItemAtPath:newPath toPath:filePath3 error:nil]){
NSLog(@"Copy failed!");
}

//读取文件属性
NSDictionary *attributes;
if ((attributes=[manager attributesOfItemAtPath:newPath error:nil])==nil) {
NSLog(@"Read attributes failed!");
}
for (NSObject *key in attributes) {
NSLog(@"%@=%@",key,attributes[key]);
}
/*结果:
NSFileOwnerAccountID=501
NSFileHFSTypeCode=0
NSFileSystemFileNumber=1781953
NSFileExtensionHidden=0
NSFileSystemNumber=16777218
NSFileSize=27
NSFileGroupOwnerAccountID=20
NSFileOwnerAccountName=kenshincui
NSFileCreationDate=2014-07-28 11:47:58 +0000
NSFilePosixPermissions=420
NSFileHFSCreatorCode=0
NSFileType=NSFileTypeRegular
NSFileExtendedAttributes={
"com.apple.TextEncoding" = <7574662d 383b3133 34323137 393834>;
}
NSFileGroupOwnerAccountName=staff
NSFileReferenceCount=1
NSFileModificationDate=2014-07-28 11:47:58 +0000
*/

//删除文件
[manager removeItemAtPath:newPath error:nil];

}
//文件操作--文件内容操作(NSData,非结构化字节流对象,有缓冲区管理机制,可用于网络传输)
void test3(){
NSFileManager *manager=[NSFileManager defaultManager];
NSString *filePath=@"/Users/kenshincui/Desktop/myNewDocument/test2.txt";
NSData *data=[manager contentsAtPath:filePath];
NSLog(@"%@",data);//存储的是二进制字节流
//结果:<68656c6c 6f20776f 726c642c e4b896e7 958ce4bd a0e5a5bd efbc81>

//NSData转化成字符串
NSString *str1=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str1);
//结果:hello world,世界你好!

//字符串转化成NSData
NSString *str2=@"Kenshin";
NSData *data2=[str2 dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",data2);

//当然一般如果仅仅是简单读取文件内容,直接用户NSString方法即可
NSString *content=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",content);
//结果:hello world,世界你好!

}
//文件操作--细粒度控制文件,文件操作柄
void test4(){
NSFileManager *manager=[NSFileManager defaultManager];
NSString *filePath=@"/Users/kenshincui/Desktop/myNewDocument/test2.txt";

//以只读方式打开文件
NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:filePath];//注意这个方法返回类型为instancetype,也就是说对于上面的NSFileHandle它的返回类型也是NSFileHandle
NSData *data= [fileHandle readDataToEndOfFile];//完整读取文件
NSString *newPath=@"/Users/kenshincui/Desktop/test4.txt";
[manager createFileAtPath:newPath contents:nil attributes:nil];
NSFileHandle *fileHandle2=[NSFileHandle fileHandleForWritingAtPath:newPath];//以可写方式打开文件
[fileHandle2 writeData:data];//写入文件内容

[fileHandle2 closeFile];//关闭文件


//定位到指定位置,默认在文件开头
[fileHandle seekToFileOffset:12];
NSData *data2= [fileHandle readDataToEndOfFile];
NSLog(@"data2=%@",[[NSString alloc]initWithData:data2 encoding:NSUTF8StringEncoding]);
//结果:data2=世界你好!

[fileHandle seekToFileOffset:6];
NSData *data3=[fileHandle readDataOfLength:5];
NSLog(@"data3=%@",[[NSString alloc]initWithData:data3 encoding:NSUTF8StringEncoding]);
//结果:data3=world

[fileHandle closeFile];

}

//文件路径
void test5(){
NSString *filePath=@"/Users/kenshincui/Desktop/myDocument";
NSString *filePath2=@"/Users/kenshincui/Desktop/test.txt";

//临时文件所在目录
NSString *path=NSTemporaryDirectory();
NSLog(@"temporary directory is :%@",path);
//结果:/var/folders/h6/lss6gncs509c2pgzgty3wd_40000gn/T/

NSString *lastComponent= [filePath lastPathComponent];
NSLog(@"%@",lastComponent); //结果:myDocument

NSLog(@"%@",[filePath stringByDeletingLastPathComponent]);
//结果:/Users/kenshincui/Desktop
NSLog(@"%@",[filePath stringByAppendingPathComponent:@"Pictrues"]);
//结果:/Users/kenshincui/Desktop/myDocument/Pictrues
NSLog(@"%@",[filePath2 pathExtension]);
//结果:txt

[[filePath pathComponents] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%i=%@",idx,obj);
}];
/*结果:
0=/
1=Users
2=kenshincui
3=Desktop
4=myDocument
*/


}

//文件操作--NSURL
void test6(){
NSURL *url=[NSURL URLWithString:@"http://developer.apple.com"];
NSString *str1=[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",str1);
}

//文件操作--NSBundle,程序包,一般用于获取Resource中的资源(当然由于当前并非IOS应用没有程序包,只是表示当前程序运行路径)
//在ios中经常用于读取应用程序中的资源文件,如图片、声音、视频等
void test7(){
//在程序包所在目录创建一个文件
NSFileManager *manager=[NSFileManager defaultManager];
NSString *currentPath=[manager currentDirectoryPath];
NSLog(@"current path is :%@",currentPath);
//结果:current path is :/Users/kenshincui/Library/Developer/Xcode/DerivedData/FoundationFramework-awxjohcpgsqcpsanqofqogwbqgbx/Build/Products/Debug
NSString *filePath=[currentPath stringByAppendingPathComponent:@"test.txt"];
[manager createFileAtPath:filePath contents:[@"Hello,world!" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];


//利用NSBundle在程序包所在目录查找对应的文件
NSBundle *bundle=[NSBundle mainBundle];//主要操作程序包所在目录
//如果有test.txt则返回路径,否则返回nil
NSString *path=[bundle pathForResource:@"test" ofType:@"txt"];//也可以写成:[bundle pathForResource:@"instructions.txt" ofType:nil];
NSLog(@"%@",path);
//结果:/Users/kenshincui/Library/Developer/Xcode/DerivedData/FoundationFramework-awxjohcpgsqcpsanqofqogwbqgbx/Build/Products/Debug/test.txt
NSLog(@"%@",[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]);
//结果:Hello,world!

//假设我们在程序运行创建一个Resources目录,并且其中新建pic.jpg,那么用下面的方法获得这个文件完整路径
NSString *path1= [bundle pathForResource:@"pic" ofType:@"jpg" inDirectory:@"Resources"];
NSLog(@"%@",path1);
//结果:/Users/kenshincui/Library/Developer/Xcode/DerivedData/FoundationFramework-awxjohcpgsqcpsanqofqogwbqgbx/Build/Products/Debug/Resources/pic.jpg
}

int main(int argc,char *argv[]){

test1();
test2();
test3();
test4();
test5();
test6();
test7();

return 0;
}

归档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253

#import <Foundation/Foundation.h>

//xml属性
void test1(){
//数组
NSString *path=@"/Users/kenshincui/Desktop/arrayXml.plist";
NSArray *array1=@[@"Kenshin",@"Kaoru",@"Rosa"];
[array1 writeToFile:path atomically:YES];

NSArray *array2=[NSArray arrayWithContentsOfFile:path];
[array2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"array2[%lu]=%@",idx,obj);
}];
/*结果:
array1[0]=Kenshin
array1[1]=Kaoru
array1[2]=Rosa
*/


//字典
NSString *path2=@"/Users/kenshincui/Desktop/dicXml.plist";
NSDictionary *dic1=@{@"name":@"Kenshin",@"age":@28,@"height":@172.5};
[dic1 writeToFile:path2 atomically:YES];

NSDictionary *dic2=[NSDictionary dictionaryWithContentsOfFile:path2];
[dic2 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"dic2[%@]=%@",key,obj);
}];
/*结果:
dic2[height]=172.5
dic2[age]=28
dic2[name]=Kenshin
*/
}

int main(int argc,char *argv[]){

test1();

return 0;
}

------NSKeyedArchiver------
//系统对象简单归档
void test1(){
//NSString归档
NSString *str1=@"Hello,world!";
NSString *path1=@"/Users/kenshincui/Desktop/archiver1.arc";
if(![NSArchiver archiveRootObject:str1 toFile:path1]){
NSLog(@"archiver failed!");
}
//NSString解档
NSString *str2= [NSUnarchiver unarchiveObjectWithFile:path1];
NSLog(@"str2=%@",str2);//结果:str2=Hello,world!


//NSArray归档
NSString *path2=@"/Users/kenshincui/Desktop/archiver2.arc";
NSArray *array1=@[@"Kenshin",@"Kaoru",@"Rosa"];
if(![NSArchiver archiveRootObject:array1 toFile:path2]){
NSLog(@"archiver failed!");
}
//NSArray解档
NSArray *array2=[NSUnarchiver unarchiveObjectWithFile:path2];
[array2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"array2[%lu]=%@",idx,obj);
}];
/*结果:
array2[0]=Kenshin
array2[1]=Kaoru
array2[2]=Rosa
*/
}

//系统复杂对象归档(多对象归档)
void test2(){
/*归档*/
NSString *path1=@"/Users/kenshincui/Desktop/archiver3.arc";

int int1=89;
CGSize size1={12.5,16.8};
NSNumber *number1=@60.5;
NSString *str1=@"Hello,world!";
NSArray *array1=@[@"Kenshin",@"Kaoru",@"Rosa"];
NSDictionary *dic1=@{@"name":@"Kenshin",@"age":@28,@"height":@172.5};

//同时对多个对象进行归档
NSMutableData *data1=[[NSMutableData alloc]init];//定义一个NSMutableData用于临时存放数据
NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:data1];//定义归档对象
[archiver encodeInt:int1 forKey:@"int"];//对int1归档并指定一个key以便以后读取
[archiver encodeSize:size1 forKey:@"size"];
[archiver encodeObject:number1 forKey:@"number"];
[archiver encodeObject:str1 forKey:@"string"];
[archiver encodeObject:array1 forKey:@"array"];
[archiver encodeObject:dic1 forKey:@"dic"];

[archiver finishEncoding];//结束归档

[data1 writeToFile:path1 atomically:YES];//写入文件



/*解档*/
int int2;
CGSize size2;
NSNumber *number2;
NSString *str2;
NSArray *array2;
NSDictionary *dic2;

NSData *data2=[[NSData alloc]initWithContentsOfFile:path1];//读出数据到NSData
NSKeyedUnarchiver *unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:data2];

int2= [unarchiver decodeInt64ForKey:@"int"];
size2=[unarchiver decodeSizeForKey:@"size"];
number2=[unarchiver decodeObjectForKey:@"number"];
str2=[unarchiver decodeObjectForKey:@"string"];
array2=[unarchiver decodeObjectForKey:@"array"];
dic2=[unarchiver decodeObjectForKey:@"dic"];

[unarchiver finishDecoding];

NSLog(@"int2=%i,size=%@,number2=%@,str2=%@,array2=%@,dic2=%@",int2,NSStringFromSize(size2),number2,str2,array2,dic2);
/*结果:
int2=89,
size={12.5, 16.800000000000001},
number2=60.5,
str2=Hello,world!,
array2=(
Kenshin,
Kaoru,
Rosa
),
dic2={
age = 28;
height = "172.5";
name = Kenshin;
}
*/
}
接下来看一下自定义的对象如何归档,上面说了如果要对自定义对象进行归档那么这个对象必须实现NSCoding协议,在这个协议中有两个方法都必须实现:

-(void)encodeWithCoder:(NSCoder *)aCoder;通过给定的Archiver对消息接收者进行编码;

-(id)initWithCoder:(NSCoder *)aDecoder;从一个给定的Unarchiver的数据返回一个初始化对象;

这两个方法分别在归档和解档时调用。下面通过一个例子进行演示(注意对于自定义类的多对象归档与系统类多对象归档完全一样,代码中不再演示):

Person.h

//
// Person.h
// FoundationFramework
//
// Created by Kenshin Cui on 14-2-16.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
@property (nonatomic,assign) float height;
@property (nonatomic,assign) NSDate *birthday;

@end
Person.m

//
// Person.m
// FoundationFramework
//
// Created by Kenshin Cui on 14-2-16.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import "Person.h"

@implementation Person

#pragma mark 解码
-(id)initWithCoder:(NSCoder *)aDecoder{
NSLog(@"decode...");
if (self=[super init]) {
self.name=[aDecoder decodeObjectForKey:@"name"];
self.age=[aDecoder decodeInt64ForKey:@"age"];
self.height=[aDecoder decodeFloatForKey:@"heiht"];
self.birthday=[aDecoder decodeObjectForKey:@"birthday"];
}
return self;
}

#pragma mark 编码
-(void)encodeWithCoder:(NSCoder *)aCoder{
NSLog(@"encode...");
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt64:_age forKey:@"age" ];
[aCoder encodeFloat:_height forKey:@"height"];
[aCoder encodeObject:_birthday forKey:@"birthday"];

}

#pragma mark 重写描述
-(NSString *)description{
NSDateFormatter *formater1=[[NSDateFormatter alloc]init];
formater1.dateFormat=@"yyyy-MM-dd";
return [NSString stringWithFormat:@"name=%@,age=%i,height=%.2f,birthday=%@",_name,_age,_height,[formater1 stringFromDate:_birthday]];
}

@end
main.m

//
// main.m
// FoundationFramework
//
// Created by Kenshin Cui on 14-2-16.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"


int main(int argc,char *argv[]){

//归档
Person *person1=[[Person alloc]init];
person1.name=@"Kenshin";
person1.age=28;
person1.height=1.72;
NSDateFormatter *formater1=[[NSDateFormatter alloc]init];
formater1.dateFormat=@"yyyy-MM-dd";
person1.birthday=[formater1 dateFromString:@"1986-08-08"];

NSString *path1=@"/Users/kenshincui/Desktop/person1.arc";

[NSKeyedArchiver archiveRootObject:person1 toFile:path1];

//解档
Person *person2= [NSKeyedUnarchiver unarchiveObjectWithFile:path1];
NSLog(@"%@",person2);
/*结果:
name=Kenshin,age=28,height=0.00,birthday=1986-08-08
*/

return 0;
}

结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
定义结构:
//方式1:
struct PathAndColor{
CGColorRef color;
CGMutablePathRef path;
};
typedef struct PathAndColor PathAndColor;

//方式2:
typedef struct PathAndColor{
CGColorRef color;
CGMutablePathRef path;
} PathAndColor;

初始化
//方式1:
PathAndColor currPath = {currColor,path};
//方式2:
PathAndColor currPath ;
currPath.color = currColor;
currPath.path = path;

// 存入集合
[paths addObject:[NSValue valueWithBytes:&currPath objCType:@encode(PathAndColor)]];
// 取出

NSValue *value = paths[index];
[noteGroupValue getValue:&noteGroup];

  • 本文作者: Linking
  • 本文链接: https://linking.fun/2017/05/11/cocoa基础的副本/
  • 版权声明: 版权所有,转载请注明出处!
  • cocoa
  • iOS

扫一扫,分享到微信

cookie操作
学习GitHub上的iOS-tips项目
  1. 1. 类别的使用例子
  2. 2. 协议的使用例子
  • block的使用
  • 结构体
  • 日期
  • 字典的使用
  • 装箱拆箱
    1. 1. 基本类型
    2. 2. 复杂类型
  • 结构体
  • 反射
    1. 1. 基本方法
    2. 2. 动态生成一个类
  • 文件操作
  • 归档
  • 结构
  • © 2015-2026 Linking
    GitHub:hexo-theme-yilia-plus by Litten
    本站总访问量次 | 本站访客数人
    • 所有文章
    • 外链

    tag:

    • weather
    • 需求
    • essay
    • basketball
    • olympic
    • nginx
    • APPScan
    • SQl盲注
    • xss
    • Ajax
    • ajax
    • ai
    • agent
    • openclaw
    • ccf
    • Nginx
    • HTML5
    • html5
    • hmtl5
    • sse
    • JavaScriptCore
    • Oracle
    • operation
    • Linux
    • deploy
    • Mac Office
    • markdown
    • ListView
    • GridView
    • MySQL
    • 慢查询
    • mongodb
    • 转置
    • thought
    • network
    • ubuntu
    • NetworkManager
    • RFKill
    • Netplan
    • avatar
    • cocoa
    • blog
    • Gitalk
    • container
    • macvlan
    • docker
    • oracle
    • cookie
    • patch
    • gitea
    • git
    • iOS
    • https
    • 多线程
    • bundle
    • 兼容性
    • HTTP
    • 绘图
    • cs
    • java
    • 效率
    • 快捷键
    • route
    • nodejs
    • pip
    • arcgis
    • arcgis 建模
    • 标识
    • redis
    • read
    • bookList
    • running
    • showdoc
    • disk
    • unit-test
    • D.Wade
    • thoughts
    • duoduo
    • Python
    • python
    • tomcat
    • 读书节
    • session
    • jdk
    • war
    • 加班
    • Android onclick事件监听
    • 正则
    • 手机品牌匹配
    • ntp
    • OpenLayers
    • Geoserver
    • wechat
    • 微信公众号
    • 爬虫
    • WeChat
    • 张靓颖
    • 动漫
    • vpn
    • PPT
    • MarkDown
    • plan
    • 朱赟
    • 极客时间专栏
    • 极客邦
    • 模块化
    • MVC
    • excel
    • NBA
    • kobe
    • team
    • crawler
    • 进度条
    • ssl
    • book
    • anti-stealing-link
    • Agentic Engineering
    • Vibe Coding
    • Software 3.0
    • Andrej Karpathy
    • LLM
    • Programming

      缺失模块。
      1、请确保node版本大于6.2
      2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
      npm i hexo-generator-json-content --save

      3、在根目录_config.yml里添加配置:

        jsonContent:
          meta: false
          pages: false
          posts:
            title: true
            date: true
            path: true
            text: false
            raw: false
            content: false
            slug: false
            updated: false
            comments: false
            link: false
            permalink: false
            excerpt: false
            categories: false
            tags: true
      

    • GitHub Trending
    • OpenAI ChatGPT
    • Gitee码云
    • 简书
    • CSDN