我個人理解就是:weak比assign多了一個功能就是當屬性所指向的對象消失的時候(也就是內存引用計數為0)會自動賦值為nil,這樣再向weak修飾的屬性發送消息就不會導致野指針操作crash。
可能不太好理解下面我寫了一個演示程序。
OC:
//
//? ViewController.m
//? weak與assgin的區別
//
//? Created by bihongbo on 15/3/19.
//? Copyright (c) 2015年 畢洪博. All rights reserved.
//
#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。
結論:在ARC模式下編程時,指針變量一定要用weak修飾,只有基本數據類型和結構體需要用assgin,例如delegate,一定要用weak修飾。
看一送一:
《iOS中assign,copy,retain之間的區別以及weak和strong的區別》
? copy: 用于希望保持一份傳入值的拷貝,而不是值自身的情況,即把原來的對象完整的賦值到另外一地方,重新加載一內存區,一個地方變了不影響另一個地方的對象。
? assign:? 簡單的直接賦值,相當于說兩個對象指向同個內存區,一個地方的變了,其他的也跟著改變。
? retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數 為1
那上面的是什么意思呢?
Copy 其實是建立了一個相同的對象,而 retain 不是:
比如一個 NSString 對象,地址為 0×1111,內容為@”ABC”
Copy 到另外一個 NSString 之 后,地址為 0×2222,內容相同,新舊對象沒有變化
retain 到另外一個 NSString 之 后,地址相同(建立一個指針,指針拷貝),內容當然相 同,這個對象的 retain 值+1
assign 地址還是0x1111,內容也還是“ABC”。
也就是說,
1.strong :除NSString\block以外的OC對象
? ? ? @property(nonatomic,strong) NSArray? *<#model#>;
2.weak:各種UI控件(但不是絕對,也有控件要使用strong屬性的,但是xib中必須使用weak,因為控件被拖進xib的時候就被strong修飾了)
? ? ? @property (nonatomic,weak) UIButton *button;
3.assign:CGFloat,NSInteger等基本數據類型、枚舉、結構體(非OC對象)
? ? ?@property(nonatomic,assign) CGFloat <#model#>;
4.copy:
? ? <1. copy : 創建的是不可變副本(如NSString、NSArray、NSDictionary)
? ? <2. ?mutableCopy :創建的是可變副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
? ? <3. @property(nonatomic,copy)NSString *<#model#>;
?@property內存管理策略的選擇
?1.非ARC
? 1> copy : 只用于NSString\block
? 2> retain : 除NSString\block以外的OC對象
? 3> assign : 基本數據類型、枚舉、結構體(非OC對象),當2個對象相互引用,一端用retain,一端用assign
?2.ARC
? 1> copy : 只用于NSString\block
? 2> strong : 除NSString\block以外的OC對象
? 3> weak : 當2個對象相互引用,一端用strong,一端用weak
? 4> assgin : 基本數據類型、枚舉、結構體(非OC對象)