__unsafe_unretained

獨樂樂發表於2018-03-05
    id __unsafe_unretained obj1 = nil;
    
    id obj0 = [[NSObject alloc]init];
    obj1 = obj0;
    
    NSLog(@"111%@",obj1);
    
    id obj2 = [[NSObject alloc]init];
    obj0 = obj2;
    
    NSLog(@"222%@",obj1);
複製程式碼

1.輸出是:111<NSObject: 0x600000209a30>
222<NSObject: 0x600000209a30>或者是輸出完111<NSObject: 0x600000209a30>就崩潰了

2.因為__unsafe_unretained是指向一個記憶體地址。本例中,obj1指向obj0,然後obj0變換了記憶體地址,但是obj1的地址是不變的。此時,obj1就變成了野指標,向該野指標傳送訊息,有可能會引起崩潰。為什麼是有可能崩潰呢。我的理解是:這個記憶體可能被其他的指標佔用了,那麼這個時候再訪問這個記憶體地址就會引起崩潰。純個人猜想,歡迎討論。

3.所以,使用__unsafe_unretained的時候,一定要保證__unsafe_unretained變數所指向的物件是存在的。