1. 程式人生 > >ARC機制之__strong具體解釋

ARC機制之__strong具體解釋

size 是否可用 導致 引用 才幹 otto pre trac bject

ARC機制之__strong具體解釋


__strong 解析:


默認情況下,一個指針都會使用 __strong 屬性,表明這是一個強引用。這意味著,僅僅要引用存在,對象就不能被銷毀。這是一種所期望的行為:當全部(強)引用都去除時,對象才幹被收集和釋放。


只是, 有時我們卻希望禁用這樣的行為:一些集合類不應該添加其元素的引用。由於這會引起對象無法釋放。在這樣的情況下,我們須要使用弱引用(不用操心,內置的集合類就是這麽幹的),使用 __weak keyword。NSHashTable就是一個樣例。

當被引用的對象消失時,弱引用會自己主動設置為 nilCocoa Notification Center

就是這麽一個樣例,盡管這已經超出純 Objective-C的語言範疇



自己更深理解:

1.(weakstrong)不同的是:當一個對象不再有strong類型的指針指向它的時候,它就會被釋放,即使改對象還有_weak類型的指針指向它;


在OC中strong就相當於retain屬性,而weak相當於assign。僅僅有一種情況你須要使用weak(默認是strong),就是為了避免retain cycles(就是父類中含有子類{父類retain了子類}。子類中又調用了父類{子類又retain了父類},這樣都無法release)

2.一旦最後一個指向該對象的strong

類型的指針離開,這個對象將被釋放,假設這個時候還有weak指針指向該對象,則會清除掉全部剩余的weak指針


以下是筆者看書時遇到的疑問

(1) : __strong在ARC關閉時是否可用

(2): __strong修飾的變量,直接賦值時,賦值的變量的retain是否會自增(被賦值的變量retain是否會自減)

(3): __strong修飾的變量在超出其作用域時retain是否會自減


解答例如以下:

(1): 能

(2): 比如:

int count = 1;

id __strong obj1 =nil;

id __strong obj = [[NSObject

alloc] init];

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具體解釋