iOS中,對象釋放機制以及__weak、__unsafe_unretained的一些問題

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

是的你沒看錯!通過個人驗證,除了字符串,字典,數組這樣操做都會報錯,相似於上邊的類同樣,可是字符串爲什麼就不會?這裏非常費解

相關文章
相關標籤/搜索