- (id)copyWithZone:(NSZone *)zone {
id copy = [[[self
class
] allocWithZone:zone] init];
return
copy;
}
NSString *string = [[NSString alloc] initWithFormat:@
"age is %i"
, 21];
NSMutableString *str = [string mutableCopy];
NSLog(@
"str: &zi"
, [str retainCount]);
NSLog(@
"string: %zi"
, [string retainCount]);
NSLog(@
"%i"
, str == string);
[str appendString@
"123456"
];
NSLog(@
"str = %@"
, str);
NSLog(@
"string = %@"
, string);
[str release];
[string release];
NSString *s1 = [[NSString alloc] initWithFormat:@
"age is %i"
, 21];
NSLog(@
"s1: %zi"
, [s1 retainCount]);
NSString *s2 = [s1 copy];
NSLog(@
"s1: %zi"
, [s1 retainCount]);
NSLog(@
"%i"
, s2 == s1);
ARC
ARC的判斷準則:只要沒有強指針指向對象,就會釋放對象
ARC的特色:
一、不容許調用release、retain、retainCount
二、容許重寫dealloc,可是不容許調用[super deallo]
三、@property的參數:
* strong:成員變量時強指針,至關於原來的retain(適用於OC對象類型)
* weak:成員變量時弱指針,至關於原來的assign(適用於OC對象類型)
* assign:適用於非OC對象類型
指針分兩種:
一、強指針:默認狀況下,全部的指針都是強指針 __strong
二、弱指針:__weak
Xcode是默認使用ARC的,若是某個.m文件真的不想使用ARC,能夠經過如下步驟來不適用ARC:
選擇Xcode右側項目樹的根,而後是TARGETS -> Build Phases -> Compile Sources,下拉,選擇目標.m文件,回車或者雙擊,彈出輸入框,輸入"-fno-objc-arc"回車,就能夠了,以下圖所示:
若是開發環境是非ARC的,想要使用ARC的,將上面的"-fno-objc-arc"改爲"-f-objc-arc"就能夠了。
ARC循環引用
當兩端循環引用的時候,解決方案以下:
一、ARC
1端用strong,另外一端用weak
二、非ARC
1端用retain,另外一端用assign
例如:
在使用ARC下,有兩個類:Person、Dog,以下:
Person.h: