__strong、__weak 與 __unsafe_unretained區別

__strong

在arc環境中默認行爲,對對象進行retain。bash

舉例spa

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    NSObject *obj = [[NSObject alloc] init];
    //默認指針被__strong修飾,等價於:__strong NSObject *p = obj;
    NSObject *p = obj;
    
    obj = nil;
    NSLog(@"obj = %@", p);
    
}
複製代碼

打印結果指針

obj = <NSObject: 0x100706b90>
複製代碼

__weak

不會對對象進行retain,當對象銷燬時,會自動指向nilcode

舉例對象

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    NSObject *obj = [[NSObject alloc] init];
    __weak NSObject *p = obj;
    obj = nil;
    NSLog(@"obj = %@", p);
    
}
複製代碼

打印結果內存

obj = (null)
複製代碼

__unsafe_unretained

不會對對象進行retain,當對象銷燬時,會依然指向以前的內存空間(野指針)string

舉例it

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

- (void)dealloc {
    NSLog(@"--dealloc--");
}

@end

int main(int argc, const char * argv[]) {
  
    Person *obj = [[Person alloc] init];
    __unsafe_unretained Person *p = obj;
    obj = nil;
    
    NSLog(@"obj = %@", p);
}
複製代碼

打印結果io

--dealloc--
obj = <Person: 0x101c5e9f0>
複製代碼

對象被釋放了,但若是內存沒有被從新利用,那麼仍是能打印出Person對象;此時訪問對即爲"殭屍"對象。class

相關文章
相關標籤/搜索