在屬性
name
的getter函數(即自動生成的)中,返回的對象如下所示?屬性/合成對 - 執行getter和setter autorelease對象?[self.name autorelease]; return self.name;
在setter函數(也自動生成的),是
retain
ED對象autorelease
d? -- (void) setName : (NSString *) someString { [someString retain]; [name release]; name = someString; /* [someString autorelease]; */ // performed internally? }
#import<Foundation/Foundation.h>
@interface Dog : NSObject
{@private NSString * name;}
@property (nonatomic,retain) NSString * name;
@end
@implementation Dog
@synthesize name;
- (id) init {
self = [super init];
if(self) {}
return self;
}
@end
int main(int argc, char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Dog * d = [[Dog alloc] init];
[d setName:@"Scooby"];
NSLog(@"Dog's name is: %@",[d name]);
[d release];
[pool drain];
return 0;
}
順便說一句,蘋果一般建議,(a)您不聲明明確伊娃背喲你的屬性,但讓編譯器爲你做; (b)你不再需要'@ synthesize'行,如果你這樣做了,最好的做法是'@synthesize name = _name;'這樣這個ivar就是'_name',以避免可能的混淆。 (c)在處理字符串時,通常使用'copy'而不是'retain'來安全,所以你不必擔心它會隨着你的變化而變化。 – Rob
請提供(a)和(b)的Objective-C文檔供進一步閱讀。謝謝! – GLES
WWDC 2012會議#405 - 現代Objective-C,約10或11分鐘到視頻。 (不幸的是,由於Apple的安全問題,您可能無法立即訪問WWDC視頻。)但是這段視頻詳細描述了它。 – Rob