iOS中,首先有一點能夠確認的,就是weak修飾的,在持有或者引用爲0的時候,爲自動將對象nil,iOS中對於一個nil發消息是不會發生崩潰等問題的,而__unsafe_unretained則否則,他不會銷燬置爲nil,所以在使用不當的時候你就會看到EXC_BAD_ACCESS...數組
本文的意思不是探討這個,咱們來研究一下weak的問題,好比按照咱們的理解,如下這段代碼:測試
person *p = [[person alloc]init]; __weak person *p1 = p; p = nil; NSLog(@"%@ %@",p,p1);
分析:因爲p與p1指向同一地址,且p1沒有retain內存地址,而 p=nil釋放了內存,因此p1爲nil。spa
經測試確實,打印爲:(null) (null)指針
那麼如下代碼呢:code
NSString *str = @"123"; __weak NSString *str1 = str; str = nil; NSLog(@"%@ %@",str,str1);
按照咱們的理解,指向同一個地址,當str=nil的時候是否是str1也是nil呢?對象
這裏看到確實blog
然而,,,笑容漸漸凝固,爲何?內存
爲何在str=nil以後str1依舊有值呢?字符串
再看下打印: (null) 123string
???????這裏我是一臉的???
經測試,字符串,字典,數組,都是這樣,並且,直接@"123"、@[@"123"]、@{@"1":@"1"}這種類型的,實際上分別是:NSCFConstantString、NSSingleObjectArrayI、NSSingleEntryDictionaryI類型。
再說回__unsafe_unretained:
person *p = [[person alloc]init]; __unsafe_unretained person *p1 = p; p = nil; NSLog(@"%@ %@",p,p1);
這段代碼,咱們分析一下,當p爲nil的時候,p1變爲野指針,並未變爲nil,所以就直接報出錯誤,可是當咱們用nsstring呢?來看一下代碼:
NSString *str = @"123"; __unsafe_unretained NSString *str1 = str; str = nil; NSLog(@"%@ %@",str,str1);
參照上邊,這段代碼會報錯麼?不會的話,結果是什麼?
結果是:(null) 123
是的你沒看錯!通過個人驗證,除了字符串,字典,數組這樣操做都會報錯,相似於上邊的類同樣,可是字符串爲什麼就不會?這裏非常費解