6.数组
系统提供的数组类:类似于C语言中的数组的功能
数组是一个大容器,数组中可以储存不同类型的对象,但必须要保证数组中储存的都是对象.
oc 中提供了两类数组:一类是NSArray(不可变数组) 一类是NSMutableArray(可变数组)
可变与不可变的区别:可变意味着可以对原有对象进行操作,不可变就意味着一旦创建,内容就不可改变
一.创建数组
1.使用初始化方法创建数组
NSArray *array = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", @"d", nil];
2.使用便利构造器方法创建数组
NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];
3.字面量
NSArray *array2 = @[@"a", @"b", @"c", @"d"];
二.数组的使用
1.数组元素的个数
NSUInteger count = array.count;
2.获取数组元素
NSString *name1 = [array objectAtIndex:0];
字面量取法
NSString *name2 = array[2];
NSString *name3 = [array firstObject];
NSString *name4 = [array lastObject];
当数组元素为空的时候,使用firstObject以及lastObject可以保证程序安全,不会崩溃,返回值是nil,但使用objectAtIndex:时,如果数组为空,则程序崩溃.
NSArray *nameArrayOne = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];
NSArray *nameArrayTwo = [NSArray arrayWithObjects:@"e", @"f", @"g", @"h", nil];
3.找某个对象对应的下标
NSUInteger index = [nameArrayOne indexOfObject:@"a"];
4.数组中是否包含某个对象
BOOL isTrue = [nameArrayOne containsObject:@"a"];
NSLog(@"isTrue == %d", isTrue);
5.判断数组是否相等
BOOL isEqual = [nameArrayOne isEqualToArray:nameArrayTwo];
NSLog(@"isEqual == %d", isEqual);
6.NSArray和NSString之间的转换
(1)字符串到数组
NSString *string = @"www.jianshu.com";
NSArray *array = [string componentsSeparatedByString:@"."]; // 以.进行分割
(2)数组到字符串
NSArray *myArray = [NSArray arrayWithObjects:@"北京", @"大连", @"上海", @"广东", @"郑州", nil];
NSString *myString = [myArray componentsJoinedByString:@"&"]; // 以&将数组中的对象连成一个字符串
三.可变数组
1.创建(3种方式)
initWithCapacity: 预先开辟一个对象容量(多少对象自己定义),使用完这些对象后,自动在开辟一个对象容量。
NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity:1];
NSMutableArray *yourArray = [NSMutableArray arrayWithCapacity:1];
NSMutableArray *bigArray = [NSMutableArray array];
2.增加数据
addObject: 在数组的最后面添加
[bigArray addObject:@"a"];
在指定位置插入一个元素
[bigArray insertObject:@"heihei" atIndex:1];
3.删除
删除指定元素
[bigArray removeObject:@"a"]; // 直接删除对象
[bigArray removeObjectAtIndex:0]; // 通过对象下标删除
替换
[bigArray replaceObjectAtIndex:1 withObject:@"haha"];
交换指定位置的两个元素
[bigArray exchangeObjectAtIndex:0 withObjectAtIndex:1];
删除全部
[bigArray removeAllObjects];
数组小结:数组是用来管理一组有序的元素的集合,必须保证数组中存放的都是对象,而且数组中可以存放相同元素.
7.字典
字典:用来存储具有一一对应关系的数据,本质上也是一个大容器 一个key对应一个value key不可以重复
字典本身是无序的 不解析数据的顺序 里面的key和value是有序的
字典里的数据是成对存在的 通过key找到value
分为不可变NSDictionary 和 可变NSMutableDictionary
一.创建字典
1.初始化
NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"zhangSan", @"name", @"nan", @"sex", nil];
2.便利构造器
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"zhangSan", @"name", @"nan", @"sex", nil];
3.字面量
NSDictionary *dic2 = @{@"name":@"zhangSan", @"sex":@"nan"};
二.字典的使用
1.求字典的元素个数
NSUInteger count = dic2.count;
2.将字典中所有的key放到一个数组中
NSArray *keys = dic2.allKeys;
3.将字典中所有的value放到一个数组中
NSArray *values = dic2.allValues;
4.字典取值
NSString *name1 = [dic2 objectForKey:@"name"];
5.判断字典是否为空 **
BOOL a = dic2.allKeys.count == 0;
三.可变字典
NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"zhangsan", @"name",@"nan", @"sex", nil];
1.字典添加一个元素
[dic setObject:@"18" forKey:@"age"];
2.修改元素
[dic setObject:@"liSi" forKey:@"name"];
setObject:forKey: 工作原理:先查找字典中有没有对应的key,如果有,则修改key对应的value,如果没有则把key-value做为元素添加到字典中.
3.移除元素
[dic removeObjectForKey:@"age"];
4.移除所有元素
[dic removeAllObjects];
8.集合
特点:无序性,互异性,本质上是一个大容器.
分为不可变NSSet 和 可变NSMutableSet
一.不可变集合
NSSet *mySet = [[NSSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"dd", @"aa", @"bb", @"bb", @"cc", nil];
1.元素的个数
NSUInteger count = mySet.count;
2.获取集合中的元素
NSString *string1 = [mySet anyObject];
3.将集合中的元素取到一个数组中
NSArray *myArray = mySet.allObjects;
二.可变集合
NSMutableSet *mySet = [[NSMutableSet alloc] initWithObjects:@"aa", @"bb", nil];
1.添加元素
[mySet addObject:@"cc"];
[mySet addObject:@"bb"];
2.移除元素
[mySet removeObject:@"aa"];
3.打印集合中的元素
for (NSString *str in mySet) {
NSLog(@"%@", str);
}
9.数组,字典,集合的区别
相同点:都是oc中的容器类,可以存储多个元素,但是元素必须都是对象,不限制对象的类型.
1.使用场景:
数组:用来管理一组有序的元素的集合.
字典:用来管理一组具有一一对应关系的数据的集合.
集合:用来管理一组无序,并且具有互异性的元素的集合.
2.特点:
数组:有序,并且元素可以重复使用.
字典:无序,key-value是字典中的一个元素,key是唯一的,一个key只能对应一个value,但是一个value可以对应多个key.
集合:无序,元素具有互异性.
3.取值方式:
数组:通过下标获取元素.
字典:通过key值获取元素.
集合:anyObject 获得一个数组 foreign遍历
10.内存管理
一.堆区内存的三种常见问题:
1.野指针问题:访问没有所有权的内存,如果想安全的访问,必须确保空间还在.
2.过度释放:对同一块空间多次释放,程序立即crash.
3.内存泄漏:空间使用完之后没有及时释放,存在安全隐患
二.内存的三种管理机制:
1.垃圾回收机制(gc):由系统来管理内存,系统识别空间何时不使用,自动回收空间,不适于iOS开发,Java采用该机制.
2.MRC:手动引用计数机制,由开发人员开辟和释放空间,并显示添加引用计数的修改代码,能够灵活的决定内存何时释放.
3.ARC:自动引用计数机制,是ios 5.0推出的,也苹果默认的内存管理机制,本质还是基于MRC,只不过对于引用计数的修改是由系统自动实现的.
alloc: +1 retain: +1 copy: +1
autorelease 如果在自动释放池内,自动释放池结束就释放了,如果在自动释放池外,会找到距离最近的自动释放池,那个自动释放池结束就回释放
三.内存管理黄金法则:
如果你对一个对象做了alloc,copy,retain操作之后,你就拥有了对象的使用权,你就有责任对它进行release,活着autorelease.
简单理解:就看自己有没有使用alloc,copy,retain这三个方法,如果使用了就必须对应上release或者autorelease, 如果没有使用,就和自己无关,不用处理.
四.内存管理问题:
1.为什么本该引用计数为0的,为什么最终还是1
引用计数只是告诉系统是否需要回收空间,当最后一次release的时候,发现引用计数为1,
就说明只有自己在使用,所以自己release之后直接回收空间即可,无需再将引用计数置0.
2.满足什么条件才会有引用计数的概念
1.必须是oc的对象
2.空间必须在堆区
(其它区的引用计数都是一个无限大的数)
五.dealloc方法 当本类的对象引用计数为0的时候会自动调用这个方法
- (void)dealloc{
[super dealloc];
}
11.协议
一.创建协议
@protocol 声明协议的关键字
方法声明在 @protocol 和 @end 中间
例如:@protocol sayHello<NSObject> // sayHello协议的名字
@required // 必须实现的方法(默认的)
- (void)sayByBy;
@optional // 不是必须实现的方法
- (void)heihei;
@end
二. 签订协议 其它类中
例如:@interface Person : NSObject<sayHello> // 签订协议 多个协议签订< , , >
三.实现协议方法 (必须实现的一定要写) 其它类中
- (void)sayByBy{
}
四.代理
1.代理第一步:声明协议
2.代理第二部分:声明代理
3.代理人第三步:代理人执行协议方法
4.代理第四步:签订协议
5.代理第五步:成为代理人
6.代理人第六步:实现协议方法
网友评论