說(shuō)實(shí)話,這兩個(gè)修飾符一直用的很多,什么時(shí)候用哪個(gè)也知道個(gè)七七八八,但要是真對(duì)這兩個(gè)的區(qū)別道出個(gè)一二三來(lái),我還真有點(diǎn)懵.因此我才感到自己的基礎(chǔ)的薄弱,于是在簡(jiǎn)書(shū)上創(chuàng)建這個(gè)文集<沉淀>,希望能把我平時(shí)看到的學(xué)到的一點(diǎn)一滴,都積累在這文集中,沉淀下來(lái),努力讓自己在iOS編程這條路上越走越遠(yuǎn),越走越深.
廢話不說(shuō),assign 平時(shí)只是用在基本類型的的修飾,比如NSInteger,float等,weak主要用在對(duì)象上,其中尤以代理用的多,幾乎都是用weak(反正我是這樣,看過(guò)MRC的代碼,其中代理是用assign的,但是我?guī)缀醪挥肕RC了).
其實(shí)呢,assign也是可以修飾對(duì)象的,比如下面這樣
@interface ViewController()
@property (nonatomic, assign) AssignView *GoodallocView;
@property (nonatomic, weak) AssignView *BadallocView;
//@property (nonatomic, weak) NSInteger age;//Property with 'weak' attribute must be of object type
@end
注:因?yàn)槭菧y(cè)試代碼,代碼中命名我是隨便起的,沒(méi)啥含義,AssignView就是普通的一個(gè)View,實(shí)現(xiàn)了一個(gè)方法:
#import
@interfaceAssignView :UIView
- (void)showHalo:(NSInteger)index;
@end
- (void)showHalo:(NSInteger)index {
NSLog(@"%ld:-- > Halo everyone!!",index);
}
assign修飾對(duì)象和weak修飾對(duì)象有什么不同呢?我看過(guò)一些網(wǎng)上的答案,weak修飾的對(duì)象不增加引用計(jì)數(shù),被釋放后自動(dòng)置為nil,而assign修飾的對(duì)象屬于指針賦值,也不會(huì)增加引用計(jì)數(shù),但是在對(duì)象被釋放后,assign修飾的這個(gè)變量并不會(huì)自動(dòng)置為nil,如果我們不手動(dòng)設(shè)置:
self.GoodallocView=nil;
那么self.GoodallocView 就會(huì)變成野指針.野指針的危害大家都知道,像野指針發(fā)送消息會(huì)直接導(dǎo)致程序崩潰.
看了很多答案都是這樣說(shuō)的,看樣子靠譜,但是有句話怎么說(shuō)的,實(shí)踐才是正道理!那我就寫(xiě)個(gè)Demo看看吧,加深印象.
代碼還是上面的代碼,我在ViewDidload中,加入如下代碼:
第一行代碼就爆了這個(gè)警告,對(duì)于處女座的我,警告我看著就難受,于是就換個(gè)法子把警告去了,
這樣就沒(méi)警告了,后面接著寫(xiě),
代碼還是很好懂得,其中延遲執(zhí)行那段說(shuō)下,根據(jù)上面說(shuō)的,assign修飾的屬性釋放后,不會(huì)置為nil,那么Demo里面就要先釋放GoodallocView,然后再看看是不是釋放后沒(méi)有置為nil.我是通過(guò)將self.GoodallocView 從self.view中移除的方法來(lái)釋放的.為了區(qū)別,我將用weak修飾的BadallocView也寫(xiě)上去了,做個(gè)對(duì)比.
運(yùn)行代碼,等延遲執(zhí)行完成后再點(diǎn)擊按鈕,程序直接崩潰
注釋我已經(jīng)寫(xiě)上了,屏蔽著一行,重新運(yùn)行,等待View消失,點(diǎn)擊按鈕,程序運(yùn)行正常.那么差不多可以得出結(jié)論,GoodView在被釋放后并沒(méi)有置為nil了,但是為了更直觀一點(diǎn),我就將這兩個(gè)對(duì)象前后地址打印出來(lái).
將上面兩行解注釋,重新運(yùn)行程序,在View消失前點(diǎn)一次按鈕,在View消失后點(diǎn)一次按鈕.
報(bào)錯(cuò),看打印的
可見(jiàn)GoodView的地址為 0x7f96ed10a300? BadView的地址為 0x7f96ed127d30
第二次點(diǎn)擊后崩潰,沒(méi)有打印值出來(lái),我們po一下,
可見(jiàn),GoodView的地址根本沒(méi)變,那么BadView的地址是不是真的是置為nil呢?試一試
確實(shí)如此,那么可以放心的得出最開(kāi)始說(shuō)的結(jié)論了.
自己寫(xiě)Demo,現(xiàn)在再寫(xiě)出來(lái),這個(gè)知識(shí)點(diǎn)記住了.