應(yīng)該怎么用
首先看一下這幾個(gè)屬性關(guān)鍵字和作用
1. strong(ARC)=retain(MRC) // default 用于修飾基于NSObject的對(duì)象
2. weak // 弱引用,防止循環(huán)引用 用于修飾基于NSObject的對(duì)象
3. assign // default 使用來修飾標(biāo)量類型的屬性(在C語言中毁枯,枚舉類型慈缔、字符型和各種整數(shù)的表示形式統(tǒng)一叫做標(biāo)量類型)
用代碼測(cè)試下
@interface TestAssign : NSObject
@property (nonatomic, [strong, weak, assign]) NSString *str; // [strong, weak, assign]代表選擇strong或weak或assign
@end
@implementation TestAssign
- (instancetype)init
{
self = [super init];
if (self) {
NSString *tmpStr = [[NSString alloc] initWithFormat:@"張。种玛。"]; // tmpStr引用計(jì)數(shù)為1
self.str = tmpStr; // 使用strong: tmpStr引用計(jì)數(shù)為2(+1); 使用weak: tmpStr引用計(jì)數(shù)1; 使用assign: tmpStr引用計(jì)數(shù)1
} // 超出tmpStr的作用域了藐鹤,引用計(jì)數(shù)-1
return self;
}
@end
TestAssign *ta = [[TestAssign alloc] init];
if (ta.str != nil) {
NSLog(@"length: %lu", [ta.str length]);
} else {
NSLog(@"ta.str is nil");
} // 使用strong: "length: 3"; 使用weak: "ta.str is nil"; 使用assign: crash(EXC_BAD_ACCESS)
strong
strong的作用是對(duì)保持對(duì)象的引用,將其引用計(jì)數(shù)+1赂韵,根據(jù)上面代碼TestAssign的init中在超出作用域后娱节,tmpStr的引用計(jì)數(shù)為1(-1),這個(gè)是正是我們想要的祭示。所以我們可以正確打印length
weak
weak并不會(huì)將對(duì)象的引用計(jì)數(shù)+1肄满,所以在超出作用域后tmpStr的引用計(jì)數(shù)為0(-1),系統(tǒng)將回收此區(qū)域內(nèi)存质涛,但是weak在對(duì)象釋放后會(huì)將str置為nil
assign
我們都知道assign使用來修飾標(biāo)量類型的屬性(在C語言中稠歉,枚舉類型、字符型和各種整數(shù)的表示形式統(tǒng)一叫做標(biāo)量類型)汇陆。它不會(huì)使對(duì)象的引用計(jì)數(shù)+1怒炸,考慮為什么NSObject的類型才可以用strong呢,是因?yàn)榉荖SObject的類型沒有實(shí)現(xiàn)retain和release的方法瞬测,引用計(jì)數(shù)是基于運(yùn)行時(shí)的横媚。針對(duì)于上面的代碼,在超出作用域后月趟,tmpStr的引用計(jì)數(shù)為0灯蝴,但是與weak不同的是assgin不會(huì)將str置為nil,所以向已經(jīng)被回收的對(duì)象發(fā)送消息行為是不確定的孝宗,所以導(dǎo)致了crash(EXC_BAD_ACCESS)