OC中的集合包含哪些?
包括NSArray、NSDictionary 和它們對應的子類?NSMutableArray、NSMutableDictionary.
數(shù)組的持久化
將數(shù)組中所有的元素的值存儲到磁盤上的文件中.
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
從plist文件中還原數(shù)組.
+(nullable NSArray?*)arrayWithContentsOfFile:(NSString *)path;
NSDictionary存在的理由?
NSArray和NSMutableArray是OC中的數(shù)組
它們存儲數(shù)據(jù)的特點是每一個元素都是緊密相連的,通過下標獲取存儲的值.
它們的缺點是數(shù)組元素的下標不固定,增加、刪除、插入等等操作后,數(shù)組元素的下標會相應發(fā)生改變.
所以我們希望有一種存儲方式,存儲到數(shù)組中,可以快速唯一的確定數(shù)據(jù)的元素.
所以字典數(shù)組(NSDictionary、NSMutableDictionary)這種鍵值對(key - value)的存儲方式就出現(xiàn)了
key - value
key 就是鍵, 就是為數(shù)據(jù)取的別名,鍵只能是遵守了NSCoping協(xié)議的對象,而NSString就是遵守了這個協(xié)議,所以字符串對象可以作為key值.
value 就是值,就是真正存儲的數(shù)據(jù),只能是OC對象.
常用的創(chuàng)建字典數(shù)組的方法
+(instancetype)dictionaryWithObjectsAndKeys:(id)firstObject,...
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"rose",@"name",@"18",@"age",@"178.5",@"height",nil];
依次的將值、鍵寫在參數(shù),最后1個寫nil.
簡要NSDictionary字典數(shù)組的方法
NSDictionary *dict = @{鍵1:值1,鍵2:值2,鍵3:值3 ......};
NSDictionary *dict = @{
?? ? ? @"name":@"rose",
?? ? ? @"age":@"18",
?? ? ? @"height":@"178.6"
?};
如何取出存儲在字典數(shù)組中的數(shù)據(jù)?
1). 字典數(shù)組中的數(shù)據(jù)不能使用下標去取.只能使用key取key對應的值.
2). 如何使用key取到這個key所對應的值.
a. 使用中括弧,在中括弧中寫上別名,就可以取到這個別名對應的數(shù)據(jù).
dict[別名];
?b.調用字典對象的方法.
-(nullable ObjectType)objectForKey:(KeyType)aKey;
如果給定的Key不存在,取到的就是nil.
ps:字典數(shù)組中的鍵是不能重復的,因為鍵是用來區(qū)分字典數(shù)組中值的唯一標識.
如何取到字典數(shù)組中鍵值對的個數(shù)?
@property(readonly)NSUInteger count;
NSDictionary字典數(shù)組的遍歷
1). 因為NSDictionary字典數(shù)組中的取值是依靠鍵來取值的,所以無法通過下標來取值.
2).使用for in循環(huán).
? ? 注意的一點是: 遍歷出來的數(shù)據(jù)是字典中的key,要取值的話,還要通過key去取值.
? ? for(NSString *key in dict){
?? ? ? ? NSLog(@"%@ = %@",key,[dict objectForKey:key]);
? ? ?}
3). 使用block來遍歷字典數(shù)組.
-(void)enumerateKeysAndObjectsUsingBlock:(void(^)(KeyType key,ObjectType obj,BOOL *stop))block;
[dict enumerateKeysAndObjectsUsingBlock:^(id? _Nonnull key,id? _Nonnull obj,BOOL * _Nonnull stop){
?? ? ? ? //key遍歷出來的鍵.
?? ? ? ? //obj遍歷出來的值.
?? ? ? ? //stop指針.
?? ? ? ? NSLog(@"%@ = %@",key,obj);
? ? ? ? if([key isEqualToString:@"age"]){
? ? ? ? ? ? *stop = YES;
?? ? ? ? }
? }];
NSDictionary數(shù)組存儲數(shù)據(jù)的原理
當我們往字典數(shù)組中存儲鍵值對的時候,這個鍵值對不是挨個挨個的存儲的,而是根據(jù)鍵值做一個哈希算法算出一個下標,然后把這個鍵值對存儲到這個字典數(shù)組中對應下標處.
我們取值是通過key取值的,這個時候仍然是根據(jù)這個key值做一個哈希算法算出這個key所在的下標,然后取值.
NSArray和NSDictionary分別的使用場景?
如果我們往數(shù)組中存儲數(shù)據(jù),存儲進去以后,凡是要取數(shù)據(jù)都是全部取出來.使用NSArray.如果取值的時候,只會取其中的特定的幾個,就使用NSDictionary數(shù)組.
可變字典數(shù)組(NSMutableDictionary)?
是NSDictionary的子類,所以它也是以鍵值對的形式來存儲數(shù)據(jù),和父類的不同之處是它的鍵值對可以動態(tài)的新增和刪除.
創(chuàng)建可變字典數(shù)組
NSMutableDictionary *dict1 =? [NSMutableDictionary new];
NSMutableDictionary *dict2 =? [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict3 =? [NSMutableDictionary dictionary];
上面的這些方法創(chuàng)建出來的可變字典的長度是0,這是有意義的.因為NSMutableDictionary對象可以動態(tài)的新增和刪除鍵值對.
最常使用創(chuàng)建NSMutableDictionary對象的方法
NSMutableDictionary *dict4 =? [NSMutableDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"17",@"age",nil];
ps: NSMutableDictionary *dict5 = @{}, 這么創(chuàng)建是不行的.
新增鍵值對
-(void)setObject:(ObjectType)anObject forKey:(KeyType )aKey;
值可以是任意的OC對象,鍵必須是遵守了NSCopying協(xié)議的對象,NSString就是遵守了這個協(xié)議.
如果鍵重復,后新增會將前面的值覆蓋掉,值是可以重復的.
刪除鍵值對
[dict removeAllObjects];//全部清空
[dict removeObjectForKey:@"name"];//刪除這個鍵對應的鍵值對.
字典數(shù)組也可以持久化為1個plist文件
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
//根據(jù)路徑拿到字典數(shù)組
+(nullable NSDictionary *)dictionaryWithContentsOfFile:(NSString *)path;
集合的內存管理
在MRC中將對象存儲到集合之中,會為這個對象的引用計數(shù)器+1,當集合銷毀的時候,就會向存儲在集合中的所有對象發(fā)送一條release消息.
使用@[] 或者@{ }創(chuàng)建的集合已經被autorelease過了,直接調用和類同名的類方法創(chuàng)建的對象也是被autorelease過的.
在ARC的模式下,集合的元素是一個強類型的指針.