weak strong 都是 修飾屬性的
@PRoperty(weak) UIButton *button;
只要有任何strong 指向某個對象A,ARC就不會摧毀它(A)。而weak所指向的對象B,只要沒有其他strong指向該對象(B),ARC會摧毀它(B)。
什么是assign,copy,retain之間的區(qū)別?
assign: 簡單賦值,不更改索引計數(shù)(Reference Counting)。
copy: 建立一個索引計數(shù)為1的對象,然后釋放舊對象
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數(shù)為1
weak 和strong的區(qū)別:
(weak和strong)不同的是 當(dāng)一個對象不再有strong類型的指針指向它的時候 它會被釋放 ,即使還有weak型指針指向它。
一旦最后一個strong型指針離去 ,這個對象將被釋放,所有剩余的weak型指針都將被清除。
可能有個例子形容是妥當(dāng)?shù)摹?/p>
想象我們的對象是一條狗,狗想要跑掉(被釋放)。
strong型指針就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。如果有5個人牽著一條狗(5個strong型指針指向1個對象),除非5個牽繩都脫落 ,否著狗是不會跑掉的。
weak型指針就像是一個小孩指著狗喊到:“看!一只狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指針)會一直指向它。只要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看著它。
只要最后一個strong型指針不再指向?qū)ο螅敲磳ο缶蜁会尫牛瑫r所有的weak型指針都將會被清除。
使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger,CGFloat)和C數(shù)據(jù)類型(int, float, double, char, 等等)
使用copy: 對NSString
使用retain: 對其他NSObject和其子類
nonatomic關(guān)鍵字:
atomic是Objc使用的一種線程保護技術(shù),基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤。而這種機制是耗費系統(tǒng)資源的,所以在iphone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。
代理時 為什么用weak 不用 strong
在開發(fā)中我們經(jīng)常使用代理,或自己寫個代理,而代理屬性都用weak(assign)修飾,看過有些開發(fā)者用strong(retain),但并沒發(fā)現(xiàn)有何不妥,也不清楚weak(assign)與strong(retain)修飾有何區(qū)別
功能實現(xiàn)就行了,考慮這么多干嘛~~~我只能哈哈哈
weak:指明該對象并不負(fù)責(zé)保持delegate這個對象,delegate這個對象的銷毀由外部控制@property (nonatomic, weak) id<HSDogDelegate>delegate;strong:該對象強引用delegate,外界不能銷毀delegate對象,會導(dǎo)致循環(huán)引用(Retain Cycles)@property (nonatomic, strong) id<HSDogDelegate>delegate;可能你還不太理解,沒關(guān)系,下面先舉例,看結(jié)果,再分析!
HSDog類HSDog.h:
HSPerson.m:
HSPerson類HSPerson.h:
HSPerson.m:
在ViewController實現(xiàn):#import "ViewController.h"#import "HSPerson.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 實例化person, self對person弱引用,person的retainCount不變 HSPerson *person = [[HSPerson alloc] init];}@end結(jié)果:weak修飾代理@property (nonatomic, weak) id<HSDogDelegate>delegate;運行->打印:
strong修飾代理@property (nonatomic, strong) id<HSDogDelegate>delegate;運行->打印:....并未打印,說明HSPerson、HSDog對象沒調(diào)用dealloc方法,兩個對象未銷毀這也是我們經(jīng)常說的內(nèi)存泄露,該釋放的內(nèi)存并未釋放!
分析:使用strong
person對dog強引用
self.dog.delegate又對person強引用,使person的retainCount + 1
當(dāng)viewController不對person引用后,dog.delegate對person還強引用著,person的retainCount為1,所以person不會釋放,dog固然也不會釋放,這就是造成循環(huán)引用的導(dǎo)致內(nèi)存泄露的原因!

person對dog強引用
self.dog.delegate只對person弱引用,并未使person的retainCount + 1
所以當(dāng)viewController不對person引用后,person的retainCount為0,即person會被釋放,那么dog也被釋放
總結(jié): weak 會被 ARC 釋放 strong 不會被自動釋放
strong vc.delegate=self 引用計數(shù)加1
weak 引用計數(shù)不加1
新聞熱點
疑難解答
圖片精選