1. 程式人生 > >iOS assign與weak的區別

iOS assign與weak的區別

相同點:兩者都是弱引用宣告型別;

不同點:weak宣告的變數在棧中就會自動清空,賦值為nil;  assign宣告的變數在棧中可能不會自動賦值為nil,就會造成野指標錯誤

注意: 在MRC下,使用delegate時使用assign,ARC時用assign需要手動釋放,建議用weak更安全。不管是MRC還是ARC,使用assign都需要手動釋放。

程式碼演示:

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,weak) id      weakPoint;

@property (nonatomic,assign) id    assignPoint;

@property (nonatomic,strong) id    strongPoint;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.strongPoint = [NSDate date];
NSLog(@"strong屬性:%@",self.strongPoint);
self.weakPoint = self.strongPoint;
self.assignPoint = self.strongPoint;
self.strongPoint = nil;
NSLog(@"weak屬性:%@",self.weakPoint);
//    NSLog(@"assign屬性:%@",self.assignPoint);
}

@end

當程式中的註釋被開啟時,執行程式有可能會崩潰(有時候不崩潰,你可能需要多執行幾次),這是因為當assign指標所指向的記憶體被釋放(釋放並不等於抹除,只是引用計數為0),不會自動賦值nil,這樣再引用self.assignPoint就會導致野指標操作,如果這個操作發生時記憶體還沒有改變內容,依舊可以輸出正確的結果,而如果發生時記憶體內容被改變了,就會crash。