objective-c不像CSharpe有一个标准库 他的标准有很多,想象一下33年前的编程语言 他都经历了什么,因为早期objective-c的一套工具库是乔老头子出走时Next-step公司写的,后来回苹果之后接着维护了。bjective-c一般常用的就是 Foundation framework。这里稍微介绍一些基础工具类。点到即止 API 太多了,我也没时间花大篇幅翻译。用到哪儿就找哪儿的API。https://developer.apple.com

NSString & NSMutableString

NSString是不可变的,NSMutbaleString是可变的。二者在类型上是不同的,但是存储的字符串是可以做对比的。
NSMutbaleString就有点类似C#的StringBuild这个类,可以做一些字符串的增删改操作。

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
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
NSMutableString* content1 =[[NSMutableString alloc] initWithString:@"hello"];
NSString* content2 = @"hello";

NSMutableString* content3 = @"hello";

if(content1 == content2)
{
NSLog(@"true1");
}else{ NSLog(@"false1");}

if([content1 isEqualToString:content2])
{
NSLog(@"true2");
}else{ NSLog(@"false2");}

if(content2 == content3)
{
NSLog(@"true3");
}else{ NSLog(@"false3");}

return 0;
}
1
2
3
4
2017-03-08 11:50:10.983555 oc[21186:821911] false1
2017-03-08 11:50:10.983740 oc[21186:821911] true2
2017-03-08 11:50:10.983756 oc[21186:821911] true3
Program ended with exit code: 0

NSString&NSMutableString常用操作梳理 - 来自CocoaChina

NSArray & NSMutableArray

和上面的NSString & NSMutableString类似。NSArray是不可变的,NSMutableArray是可变的。二者在类型上是不同的。如果需要操作数组还是用NSMutableString,这个版本的array。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import <Foundation/Foundation.h>

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

NSMutableDictionary* ary = [[NSMutableDictionary alloc]init];
[ary setObject:@"helloworld" forKey:@"123"];
[ary setObject:@"helloworld" forKey:@"1233"];
[ary removeObjectForKey:@"1233"];

NSLog(@"%@ + count %lu",[ary valueForKey:@"123"],(unsigned long) ary.count);

[ary removeAllObjects];

return 0;
}

NSMutableDictionary 与 NSMutableArray注意的地方 - 来自博客园

NSSet

特点比较明显,无序,不重复。

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
NSSet *set1 = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil];
NSSet *set2 = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", nil];
NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
NSSet *set3 = [NSSet setWithArray:array];

NSLog(@"set1 :%@", set1);
NSLog(@"set2 :%@", set2);
NSLog(@"set3 :%@", set3);

//获取集合个数
NSLog(@"set1 count :%d", set1.count);

//以数组的形式获取集合中的所有对象
NSArray *allObj = [set2 allObjects];
NSLog(@"allObj :%@", allObj);

//获取任意一对象
NSLog(@"anyObj :%@", [set3 anyObject]);

//是否包含某个对象
NSLog(@"contains :%d", [set3 containsObject:@"obj2"]);


//是否包含指定set中的对象
NSLog(@"intersect obj :%d", [set1 intersectsSet:set3]);

//是否完全匹配
NSLog(@"isEqual :%d", [set2 isEqualToSet:set3]);

//是否是子集合
NSLog(@"isSubSet :%d", [set3 isSubsetOfSet:set1]);



NSSet *set4 = [NSSet setWithObjects:@"a", @"b", nil];
NSArray *ary = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
NSSet *set5 = [set4 setByAddingObjectsFromArray:ary];
NSLog(@"addFromArray :%@", set5);




NSMutableSet *mutableSet1 = [NSMutableSet setWithObjects:@"1", @"2", @"3", nil];
NSMutableSet *mutableSet2 = [NSMutableSet setWithObjects:@"a", @"2", @"b", nil];
NSMutableSet *mutableSet3 = [NSMutableSet setWithObjects:@"1", @"c", @"b", nil];

//集合元素相减
[mutableSet1 minusSet:mutableSet2];
NSLog(@"minus :%@", mutableSet1);

//只留下相等元素
[mutableSet1 intersectSet:mutableSet3];
NSLog(@"intersect :%@", mutableSet1);

//合并集合
[mutableSet2 unionSet:mutableSet3];
NSLog(@"union :%@", mutableSet2);

//删除指定元素
[mutableSet2 removeObject:@"a"];
NSLog(@"removeObj :%@", mutableSet2);


//删除所有数据
[mutableSet2 removeAllObjects];
NSLog(@"removeAll :%@", mutableSet2);

控制台输出:

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
2017-03-08 17:08:04.567792 oc[49686:2060915] set1 :{(
d,
b,
c,
a
)}
2017-03-08 17:08:04.568507 oc[49686:2060915] set2 :{(
1,
2,
3
)}
2017-03-08 17:08:04.568550 oc[49686:2060915] set3 :{(
a,
b,
c
)}
2017-03-08 17:08:04.568570 oc[49686:2060915] set1 count :4
2017-03-08 17:08:04.568688 oc[49686:2060915] allObj :(
1,
2,
3
)
2017-03-08 17:08:04.568749 oc[49686:2060915] anyObj :a
2017-03-08 17:08:04.568773 oc[49686:2060915] contains :0
2017-03-08 17:08:04.568794 oc[49686:2060915] intersect obj :1
2017-03-08 17:08:04.568812 oc[49686:2060915] isEqual :0
2017-03-08 17:08:04.568828 oc[49686:2060915] isSubSet :1
2017-03-08 17:08:04.568876 oc[49686:2060915] addFromArray :{(
3,
b,
1,
4,
2,
a
)}
2017-03-08 17:08:04.568940 oc[49686:2060915] minus :{(
1,
3
)}
2017-03-08 17:08:04.568978 oc[49686:2060915] intersect :{(
1
)}
2017-03-08 17:08:04.569003 oc[49686:2060915] union :{(
b,
1,
2,
a,
c
)}
2017-03-08 17:08:04.569025 oc[49686:2060915] removeObj :{(
b,
1,
2,
c
)}
2017-03-08 17:08:04.569043 oc[49686:2060915] removeAll :{(
)}
Program ended with exit code: 0

NSSet使用小结 - 来自CNBLOG

NSValue & NSNumber & NSData

由于集合里只能存放对象,不可以存放基本数据类型,所以我们有时候需要讲一些对象比如基本数据类型,结构体等存到NSDictionary NSArray中,我们就需要将这些数据类型或结构体包装成OC对象,以便集合能访问到。常用的用来包装这些类型的有NSNumber NSValue

NSValue

NSValue可以包装任意一个对象,包括系统自定义的数据结构,结构体等等

将结构体包装成OC对象:

1
2
3
4
5
CGPoint p = CGPointMake(1,2);
NSValue *val = [NSValue valueWithPoint:p];//将结构体p包装成NSValue对象

//拆
[value pointValue]

NSNumber 与NSValue -来自简书

NSNumber

  1. NSNumber是NSValue的一个子类
  2. NSNumber只能包装基本数据类型,比如int, float,char,BOOL等
    1
    2
    3
    4
    5
    6
    7
    //包装
    int age = 20;
    NSNumber *num = [NSNumber numberWithInt:age];//将基本数据类型int对象age 包装成NSNumber对象
    @(age);//直接包装

    //拆封
    [num intValue];
    NSNumber 与NSValue -来自简书

NSData

NSData和NSMutableData -来自360doc

NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛。NSData创建后不可以再修改,NSMutableData可以再次修改。

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
1NSStringNSData之间的转换
NSString *string = @“哎我去上市了!";
//1、字符串转换成NSData
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//2、NSData转换成字符串
NSString * inString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];


2、UIImage和NSData之间的转换


//获取图片路径
NSString *imgPath = [[NSBundle mainBundle] pathForResource:@"01loading.png" ofType:nil];
NSData *imgData = [NSData dataWithContentsOfFile:imgPath];
//直接使用,也可写入文件
self.imageView.image = [UIImage imageWithData:imgData];
1>.数据库里存储图片 存储图片路径 /images/car@2x.png;
2>.如果图片是较小的 可以将UIImage转换成NSData存数据库。

3、NSNumber、NSArray、NSDictionary和NSData之间的转换


数组转NSData是建立在归档的基础上,归档也称为序列化,OC中NSString 对象、NSNumber对象、NSArray对象
NSDictionary字典对象、NSData 数据对象、这些类要进行数据保存时可以通过NSKeyedArchive 类来实现。
Foundtaion框架<Foundation/NSKeyedArchiver.h>提供归档和解归档的方式,也叫做序列化和反序列化的过程。
1>.把字典或数组用归档形式直接保存到某一个文件中
//初始化一个字典
NSDictionary *dict = @{
@"key1":@"hahahah1",
@"key2":@"hahahah2",
@"key3":@"hahahah3",
@"key4":@"hahahah4",
@"key5":@"hahahah5",
@"key6":@"hahahah6",
@"key7":@"hahahah7"};
//归档路径
NSString *docPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"dict.plist"];
//归档后直接保存到文件中
[NSKeyedArchiver archiveRootObject:dict toFile:docPath];

2>.把字典或数组先转换成NSData,再保存到某一个文件中
//初始化一个字典
NSDictionary *dict = @{
@"key1":@"hahahah1",
@"key2":@"hahahah2",
@"key3":@"hahahah3",
@"key4":@"hahahah4",
@"key5":@"hahahah5",
@"key6":@"hahahah6",
@"key7":@"hahahah7"};
//归档路径
NSString *docPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"dict.plist"];
//转换成NSData
NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];
//保存到文件中
NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:docPath contents:dictData attributes:nil];
3>.解归档
直接从文件解归档
NSDictionary *Undict = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
将文件转换成NSData,在从NSData解归档
NSData *UndictData = [fm contentsAtPath:docPath];
NSDictionary *Undict = [NSKeyedUnarchiver unarchiveObjectWithData:UndictData];

iO操作

Objective-C文件和目录操作,IOS文件操作,NSFileManager使用文件操作 -来自CSDN

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
Objective-C文件和目录操作,IOS文件操作,NSFileManager使用文件操作:

objective-c通过使用NSFileManager类来管理和操作文件、目录,NSFileManager,文件或目录是使用文件的路径名的唯一标示。每个路径名都是一个NSString对象。
NSFileManager对象通过defaultManager方法来创建实例
列如:
NSFileManager *fm = [NSFileManager defaultManager];

删除某个文件
[fm removeItemAtPath:@"filename" error:NULL];
error:参数是一个指向NSError对象的指针,能够提供错误的信息。如果指定为NULL的话就会使用默认的行为,返回值是BOOL类型的方法,操作成功返回YES反之返回NO

判断文件是否被删除
if([fm removeItemAtPath:@"filename" error:NULL]==NO){
NSLog(@"文件删除失败");
return 1;
}

NSFileManager常用的文件方法:

-(NSData*)contentsAtPath:path 从一个文件中读取数据

-(BOLL)createFileAtPath:path contents:(NSData*)data attributes: attr 向一个文件写入数据

-(BOOL)removeItemAtPath:path error:err 删除一个文件

-(BOOL)moveItemAtPath:from toPath:to error:err 重命名或移动一个文件(to 不能是已存在的)

-(BOOL)copyItemAtPath:from toPath:to error:err 复制文件(to 不能是已存在的)

-(BOOL)contentsEqualAtPath:path1 andPath:path2 比较这两个文件的内容

-(BOOL)fileExistsAtPath:path 测试文件是否存在

-(BOOL)isReadableFileAtPath:path 测试文件是否存在,并且是否能执行读操作

-(BOOL)isWritableFileAtPath:path 测试文件是否存在,并且是否能执行写操作

-(NSDictionary*)attributesOfItemAtPath:path error:err 获取文件的属性
属性字典允许你指定要创建的文件的权限,如果将该参数指定为nil,该文件会被设置为默认权限。

1、通过一段程序来对文件进行操作:
//
// main.m
// NSFileManager_01
//
// Created by swinglife on 13-11-10.
// Copyright (c) 2013年 swinglife. All rights reserved.
//

#import <Foundation/Foundation.h>

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

@autoreleasepool {
//文件名
NSString *fileName = @"testFile";
NSString *fileContent = @"这是文件内容!!!!";
NSData *fileData = [fileContent dataUsingEncoding:NSUTF8StringEncoding];

//创建NSFileManager实例
NSFileManager *fm = [NSFileManager defaultManager];

//创建文件
[fm createFileAtPath:fileName contents:fileData attributes:nil];

//判断文件是否存在 不存在就结束程序
if([fm fileExistsAtPath:fileName]==NO){
NSLog(@"文件不存在");
return 1;
}

//拷贝文件
if([fm copyItemAtPath:fileName toPath:@"newFile" error:NULL]==NO){
NSLog(@"复制失败");
return 2;
}

//测试两个文件是否相同
if([fm contentsEqualAtPath:fileName andPath:@"newFile"]==NO){
NSLog(@"文件不相同");
return 3;
}

//重命名newFile
[fm moveItemAtPath:@"newFile" toPath:@"newFile2" error:NULL];

//获取newFile2的大小
NSDictionary *fileAttr = [fm attributesOfItemAtPath:@"newFile2" error:NULL];
if(fileAttr!=nil){
NSLog(@"文件大小:%llu bytes",[[fileAttr objectForKey:NSFileSize] unsignedLongLongValue]);
}

//删除文件
[fm removeItemAtPath:fileName error:NULL];

//显示newFile2的内容
NSString *data = [NSString stringWithContentsOfFile:@"newFile2" encoding:NSUTF8StringEncoding error:NULL];
NSLog(@"%@",data);


}
return 0;
}

NSFileManager常用的目录方法

-(NSString*)currentDirectoryPath 获取当前目录

-(BOOL)changeCurrentDirectoryPath:path 更改当前目录

-(BOOL)copyItemAtPath:from toPath:to error:err 复制目录结构

-(BOOL)createDirectoryAtPath:path withIntermediateDirectories:(BOOL)flag attributes:attr 创建一个新目录

-(BOOL)fileExistsAtPath:path isDirectory:(BOOL*)flag 测试文件是不是目录(flag中存储结果)

-(NSArray*)contentsOfDirectoryAtPath:path error:err 列出目录内容

-(NSDirectoryEnumerator*)enumeratorAtPath:path 枚举目录的内容

-(BOOL)removeItemAtPath:path error:err 删除空目录

-(BOOL)moveItemAtPath:from toPath:to error:err 重命名或移动一个目录

2、通过一段程序来对目录进行操作:
//
// main.m
// NSFileManager_02
//
// Created by swinglife on 13-11-10.
// Copyright (c) 2013年 swinglife. All rights reserved.
//

#import <Foundation/Foundation.h>

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

@autoreleasepool {
//文件目录
NSString *dirName = @"testDir";

//创建NSFileManager实例
NSFileManager *fm = [NSFileManager defaultManager];

//获取当前目录
NSString *path = [fm currentDirectoryPath];
NSLog(@"Path:%@",path);

//创建新目录
[fm createDirectoryAtPath:dirName withIntermediateDirectories:YES attributes:nil error:NULL];

//重命名新的目录
[fm moveItemAtPath:dirName toPath:@"newDir" error:NULL];

//更改当前目录到新的目录
[fm changeCurrentDirectoryPath:@"newDir"];

//获取当前工作目录
path = [fm currentDirectoryPath];
NSLog(@"Path:%@",path);

}
return 0;
}