ARC機制之__strong具體解釋
ARC機制之__strong具體解釋
__strong 解析:
默認情況下,一個指針都會使用 __strong 屬性,表明這是一個強引用。這意味著,僅僅要引用存在,對象就不能被銷毀。這是一種所期望的行為:當全部(強)引用都去除時,對象才幹被收集和釋放。
只是, 有時我們卻希望禁用這樣的行為:一些集合類不應該添加其元素的引用。由於這會引起對象無法釋放。在這樣的情況下,我們須要使用弱引用(不用操心,內置的集合類就是這麽幹的),使用 __weak keyword。NSHashTable就是一個樣例。
當被引用的對象消失時,弱引用會自己主動設置為 nil。Cocoa的 Notification Center
自己更深理解:
1.(weak與strong)不同的是:當一個對象不再有strong類型的指針指向它的時候,它就會被釋放,即使改對象還有_weak類型的指針指向它;
在OC中strong就相當於retain屬性,而weak相當於assign。僅僅有一種情況你須要使用weak(默認是strong),就是為了避免retain cycles(就是父類中含有子類{父類retain了子類}。子類中又調用了父類{子類又retain了父類},這樣都無法release)
2.一旦最後一個指向該對象的strong
以下是筆者看書時遇到的疑問
(1) : __strong在ARC關閉時是否可用
(2): __strong修飾的變量,直接賦值時,賦值的變量的retain是否會自增(被賦值的變量retain是否會自減)
(3): __strong修飾的變量在超出其作用域時retain是否會自減
解答例如以下:
(1): 能
(2): 比如:
int count = 1;
id __strong obj1 =nil;
id __strong obj = [[NSObject
obj1 = obj;//obj1 持有obj 賦值對象的強引用 會導致obj retain自增
NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));
NSLog(@"obj = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));
打印例如以下:
2015-07-22 17:23:22.169字典[724:25567] Retain count is 2
2015-07-22 17:23:22.171字典[724:25567] obj = 2
說明:(1) :當一個對象獲得還有一個對象的強引用時,retain++;
(2): 被賦值的變量retain是會自減
(3):
int count =1;
id __strong obj1 =nil;
if(count){
id __strong obj = [[NSObjectalloc] init];
obj1 = obj;//obj1 持有obj 賦值對象的強引用 會導致obj retain自增
NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));
}
NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj1));
__strong修飾的變量在超出其作用域時retain是會自減
ARC機制之__strong具體解釋