OC中的集合

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的模式下,集合的元素是一個強類型的指針.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容