6.數(shù)組
系統(tǒng)提供的數(shù)組類:類似于C語言中的數(shù)組的功能
數(shù)組是一個(gè)大容器,數(shù)組中可以儲(chǔ)存不同類型的對(duì)象,但必須要保證數(shù)組中儲(chǔ)存的都是對(duì)象.
oc 中提供了兩類數(shù)組:一類是NSArray(不可變數(shù)組) 一類是NSMutableArray(可變數(shù)組)
可變與不可變的區(qū)別:可變意味著可以對(duì)原有對(duì)象進(jìn)行操作,不可變就意味著一旦創(chuàng)建,內(nèi)容就不可改變
一.創(chuàng)建數(shù)組
1.使用初始化方法創(chuàng)建數(shù)組
NSArray *array = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", @"d", nil];
2.使用便利構(gòu)造器方法創(chuàng)建數(shù)組
NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];
3.字面量
NSArray *array2 ?= @[@"a", @"b", @"c", @"d"];
二.數(shù)組的使用
1.數(shù)組元素的個(gè)數(shù)
NSUInteger count = array.count;
2.獲取數(shù)組元素
NSString *name1 = [array objectAtIndex:0];
字面量取法
NSString *name2 = array[2];
NSString *name3 = [array firstObject];
NSString *name4 = [array lastObject];
當(dāng)數(shù)組元素為空的時(shí)候妒峦,使用firstObject以及l(fā)astObject可以保證程序安全,不會(huì)崩潰,返回值是nil,但使用objectAtIndex:時(shí)兵睛,如果數(shù)組為空,則程序崩潰.
NSArray *nameArrayOne = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];
NSArray *nameArrayTwo = [NSArray arrayWithObjects:@"e", @"f", @"g", @"h", nil];
3.找某個(gè)對(duì)象對(duì)應(yīng)的下標(biāo)
NSUInteger index = [nameArrayOne indexOfObject:@"a"]; ? ?
4.數(shù)組中是否包含某個(gè)對(duì)象
BOOL isTrue = [nameArrayOne containsObject:@"a"]; ? ? ? ? ?
NSLog(@"isTrue == %d", isTrue);
5.判斷數(shù)組是否相等
BOOL isEqual = [nameArrayOne isEqualToArray:nameArrayTwo];
NSLog(@"isEqual == %d", isEqual);
6.NSArray和NSString之間的轉(zhuǎn)換
(1)字符串到數(shù)組
NSString *string = @"www.reibang.com";
NSArray *array = [string componentsSeparatedByString:@"."]; ?// 以.進(jìn)行分割
(2)數(shù)組到字符串
NSArray *myArray = [NSArray arrayWithObjects:@"北京", @"大連", @"上海", @"廣東", @"鄭州", nil];
NSString *myString = [myArray componentsJoinedByString:@"&"]; ?// 以&將數(shù)組中的對(duì)象連成一個(gè)字符串
三.可變數(shù)組
1.創(chuàng)建(3種方式) ? ? ? ?
?initWithCapacity: ? ?預(yù)先開辟一個(gè)對(duì)象容量(多少對(duì)象自己定義),使用完這些對(duì)象后,自動(dòng)在開辟一個(gè)對(duì)象容量。
NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity:1];
NSMutableArray *yourArray = [NSMutableArray arrayWithCapacity:1];
NSMutableArray *bigArray = [NSMutableArray array];
2.增加數(shù)據(jù)? ?
?addObject: 在數(shù)組的最后面添加
[bigArray addObject:@"a"];
在指定位置插入一個(gè)元素
[bigArray insertObject:@"heihei" atIndex:1];
3.刪除
刪除指定元素
[bigArray removeObject:@"a"]; ? // 直接刪除對(duì)象
[bigArray removeObjectAtIndex:0]; ? // 通過對(duì)象下標(biāo)刪除
替換
[bigArray replaceObjectAtIndex:1 withObject:@"haha"];
交換指定位置的兩個(gè)元素
[bigArray exchangeObjectAtIndex:0 withObjectAtIndex:1];
刪除全部
[bigArray removeAllObjects];
數(shù)組小結(jié):數(shù)組是用來管理一組有序的元素的集合笛丙,必須保證數(shù)組中存放的都是對(duì)象,而且數(shù)組中可以存放相同元素.
7.字典
字典:用來存儲(chǔ)具有一一對(duì)應(yīng)關(guān)系的數(shù)據(jù),本質(zhì)上也是一個(gè)大容器? 一個(gè)key對(duì)應(yīng)一個(gè)value? key不可以重復(fù)
字典本身是無序的? 不解析數(shù)據(jù)的順序? 里面的key和value是有序的
字典里的數(shù)據(jù)是成對(duì)存在的 通過key找到value
分為不可變NSDictionary? 和 可變NSMutableDictionary
一.創(chuàng)建字典
1.初始化
NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"zhangSan", @"name", @"nan", @"sex", nil];
2.便利構(gòu)造器
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"zhangSan", @"name", @"nan", @"sex", nil];
3.字面量
NSDictionary *dic2 = @{@"name":@"zhangSan", @"sex":@"nan"};
二.字典的使用
1.求字典的元素個(gè)數(shù)
NSUInteger count = dic2.count;
2.將字典中所有的key放到一個(gè)數(shù)組中
NSArray *keys = dic2.allKeys;
3.將字典中所有的value放到一個(gè)數(shù)組中
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.字典添加一個(gè)元素
[dic setObject:@"18" forKey:@"age"];
2.修改元素
[dic setObject:@"liSi" forKey:@"name"];
setObject:forKey: 工作原理:先查找字典中有沒有對(duì)應(yīng)的key胚鸯,如果有笨鸡,則修改key對(duì)應(yīng)的value姜钳,如果沒有則把key-value做為元素添加到字典中.
3.移除元素
[dic removeObjectForKey:@"age"];
4.移除所有元素
[dic removeAllObjects];
8.集合
特點(diǎn):無序性,互異性,本質(zhì)上是一個(gè)大容器.
分為不可變NSSet 和 可變NSMutableSet
一.不可變集合
NSSet *mySet = [[NSSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"dd", @"aa", @"bb", @"bb", @"cc", nil];
1.元素的個(gè)數(shù)
NSUInteger count = mySet.count;
2.獲取集合中的元素
NSString *string1 = [mySet anyObject];
3.將集合中的元素取到一個(gè)數(shù)組中
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.數(shù)組,字典,集合的區(qū)別
相同點(diǎn):都是oc中的容器類,可以存儲(chǔ)多個(gè)元素,但是元素必須都是對(duì)象,不限制對(duì)象的類型.
1.使用場(chǎng)景:
數(shù)組:用來管理一組有序的元素的集合.
字典:用來管理一組具有一一對(duì)應(yīng)關(guān)系的數(shù)據(jù)的集合.
集合:用來管理一組無序,并且具有互異性的元素的集合.
2.特點(diǎn):
數(shù)組:有序,并且元素可以重復(fù)使用.
字典:無序,key-value是字典中的一個(gè)元素,key是唯一的,一個(gè)key只能對(duì)應(yīng)一個(gè)value,但是一個(gè)value可以對(duì)應(yīng)多個(gè)key.
集合:無序,元素具有互異性.
3.取值方式:
數(shù)組:通過下標(biāo)獲取元素.
字典:通過key值獲取元素.
集合:anyObject? 獲得一個(gè)數(shù)組? foreign遍歷
10.內(nèi)存管理
一.堆區(qū)內(nèi)存的三種常見問題:
1.野指針問題:訪問沒有所有權(quán)的內(nèi)存,如果想安全的訪問,必須確备缜牛空間還在.
2.過度釋放:對(duì)同一塊空間多次釋放,程序立即crash.
3.內(nèi)存泄漏:空間使用完之后沒有及時(shí)釋放,存在安全隱患
二.內(nèi)存的三種管理機(jī)制:
1.垃圾回收機(jī)制(gc):由系統(tǒng)來管理內(nèi)存泰讽,系統(tǒng)識(shí)別空間何時(shí)不使用,自動(dòng)回收空間,不適于iOS開發(fā)已卸,Java采用該機(jī)制.
2.MRC:手動(dòng)引用計(jì)數(shù)機(jī)制,由開發(fā)人員開辟和釋放空間,并顯示添加引用計(jì)數(shù)的修改代碼,能夠靈活的決定內(nèi)存何時(shí)釋放.
3.ARC:自動(dòng)引用計(jì)數(shù)機(jī)制累澡,是ios 5.0推出的,也蘋果默認(rèn)的內(nèi)存管理機(jī)制,本質(zhì)還是基于MRC,只不過對(duì)于引用計(jì)數(shù)的修改是由系統(tǒng)自動(dòng)實(shí)現(xiàn)的.
alloc: +1? retain: +1? copy: +1
autorelease 如果在自動(dòng)釋放池內(nèi),自動(dòng)釋放池結(jié)束就釋放了愧哟,如果在自動(dòng)釋放池外,會(huì)找到距離最近的自動(dòng)釋放池蕊梧,那個(gè)自動(dòng)釋放池結(jié)束就回釋放
三.內(nèi)存管理黃金法則:
如果你對(duì)一個(gè)對(duì)象做了alloc,copy,retain操作之后,你就擁有了對(duì)象的使用權(quán),你就有責(zé)任對(duì)它進(jìn)行release,活著autorelease.
簡(jiǎn)單理解:就看自己有沒有使用alloc,copy,retain這三個(gè)方法,如果使用了就必須對(duì)應(yīng)上release或者autorelease, 如果沒有使用,就和自己無關(guān),不用處理.
四.內(nèi)存管理問題:
1.為什么本該引用計(jì)數(shù)為0的,為什么最終還是1
引用計(jì)數(shù)只是告訴系統(tǒng)是否需要回收空間,當(dāng)最后一次release的時(shí)候,發(fā)現(xiàn)引用計(jì)數(shù)為1,
就說明只有自己在使用,所以自己release之后直接回收空間即可,無需再將引用計(jì)數(shù)置0.
2.滿足什么條件才會(huì)有引用計(jì)數(shù)的概念
1.必須是oc的對(duì)象
2.空間必須在堆區(qū)
(其它區(qū)的引用計(jì)數(shù)都是一個(gè)無限大的數(shù))
五.dealloc方法 ? ? ? ?當(dāng)本類的對(duì)象引用計(jì)數(shù)為0的時(shí)候會(huì)自動(dòng)調(diào)用這個(gè)方法
- (void)dealloc{
[super dealloc];
}
11.協(xié)議
一.創(chuàng)建協(xié)議
@protocol 聲明協(xié)議的關(guān)鍵字
方法聲明在 @protocol 和? @end? 中間
例如:@protocol sayHello<NSObject>? ? //? sayHello協(xié)議的名字
@required ? ? ? ?// 必須實(shí)現(xiàn)的方法(默認(rèn)的)
- (void)sayByBy;
@optional ? ? ? // 不是必須實(shí)現(xiàn)的方法
- (void)heihei;
@end
二. 簽訂協(xié)議? ? 其它類中
例如:@interface Person : NSObject<sayHello>? ? ? // 簽訂協(xié)議 多個(gè)協(xié)議簽訂< , , >
三.實(shí)現(xiàn)協(xié)議方法? (必須實(shí)現(xiàn)的一定要寫)? 其它類中
- (void)sayByBy{
}
四.代理
1.代理第一步:聲明協(xié)議
2.代理第二部分:聲明代理
3.代理人第三步:代理人執(zhí)行協(xié)議方法
4.代理第四步:簽訂協(xié)議
5.代理第五步:成為代理人
6.代理人第六步:實(shí)現(xiàn)協(xié)議方法