屬性修飾符
訪問權限
-
readonly 只讀權限
-
readwrite 可讀可寫權限
線程安全
-
atomic 原子性 注:atomic所說的線程安全只是保證了getter和setter存取方法的線程安全瑞佩,并不能保證整個對象是線程安全的
@property (atomic,strong) NSString *testa;//正確
@property (noatomic,strong) NSString *testa;//錯誤
//atomic 保證setter getter 安全
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (NSInteger i = 0; i<10000000; i++) {
dispatch_async(queue, ^{
@autoreleasepool {
self.testa = [NSString stringWithFormat:@"testssss%zd",i];
NSLog(@"%@",self.testa);
}
});
}
});
//但保證不了對self.testa 進行其他操作的安全性
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (NSInteger i = 0; i<10000000; i++) {
dispatch_async(queue, ^{
if (i%2==0) {
self.testa = @"aaaaaaaaaaaa";
} else {
self.testa = @"aaaaa";
}
});
}
});
dispatch_async(queue, ^{
NSString *str = [self.testa substringWithRange:NSMakeRange(0, 7)];
});
-
nonatomic 非原子性 讀寫速度比atomic快,原因是不涉及線程安全的判斷以及對應的操作
指定方法名稱
-
getter=method 指定get方法名
-
setter=method 指定set方法名
內存管理
-
retain 一般是在MRC下用來修飾對象,修飾對象為強引用,使其引用計數(shù)+1,保證對象不被銷毀,只要還有一個變量指向對象.對象就會保持在內存中.當指針指向新值,或者指針不再存在時,相關聯(lián)的對象就會自動釋放.
-
assign 一般用來修飾基本數(shù)據(jù)類型,修飾對象為弱引用,而且不會將已經(jīng)釋放的指針值nil,容易引起野指針問題,在 set 方法中 ARC 系統(tǒng)不會調用 引用計數(shù)器相關的代碼執(zhí)行, 只是簡單的賦值而已,計數(shù)器不會改變.其為非OC對象.
-
strong 和retain 但是,是在ARC下修飾對象的.在 set 方法中 ARC 系統(tǒng)會自動幫我們加入對 新值 retain 使其引用計數(shù)器 + 1 的代碼,并且對舊 值進行 release 使其引用計數(shù)器 - 1 的代碼.
-
weak 同樣是出現(xiàn)在ARC下修飾對象的,修飾對象為弱引用,在 set 方法中 ARC 系統(tǒng)不會調用 引用計數(shù)器相關的 代碼執(zhí)行,只是簡單的賦值而已,所以其引用計數(shù)器不會改變.其為OC對象镀岛。用weak修飾對象時安全的,因為用weak修飾過的對象,在對象被釋放時,會將指向對象的指針置nil,避免了野指針的問題.
補充: weak置nil 是怎么實現(xiàn)的?
weak屬性的特點:
weak 表明該屬性定義了一種“非擁有關系” (nonowning relationship)。
為weak屬性設置新值時赢底,設置方法既不保留新值疼鸟,也不釋放舊值后控。
同assign類似,然而在屬性所指的對象釋放時候空镜,屬性值也會清空(nil out)浩淘。
runtime是如何實現(xiàn) weak 變量的自動置nil?
weak 對象會放入一個 hash 表中吴攒。
用 weak 指向的對象內存地址作為 key张抄,當此對象的引用計數(shù)為0的時候會 dealloc。
假如 weak 指向的對象內存地址是addr洼怔,那么就會以addr為鍵署惯, 在這個 weak 表中搜索,找到所有以addr為鍵的 weak 對象镣隶,從而設置為 nil极谊。
具體機制:
objc_storeWeak(&weakPo, Model)函數(shù):
objc_storeWeak函數(shù)把賦值對象(Model)的內存地址作為鍵值key,將weak修飾的屬性變量(weakPo)的內存地址(& weakPo)作為value安岂,注冊到 weak 表中轻猖。
如果Model為0(nil),那么把變量(weakPo)的內存地址(& weakPo)從weak表中刪除嗜闻,
可以把objc_storeWeak(&weakPo, Model)理解為:objc_storeWeak(value, key)蜕依,并且當key變nil,將value置nil琉雳。
在Model非nil時样眠,weakPo和Model指向同一個內存地址,在Model變nil時翠肘,weakPo變nil檐束。此時向weakPo發(fā)送消息不會崩潰:在Objective-C中向nil發(fā)送消息是安全的。
-
copy 拷貝了一份相同的內容,在 set 方法中 ARC 系統(tǒng)會自動幫我們加入對 新值 copy 的代碼束倍。引用計數(shù)器不變.
未完待續(xù)...
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者