【发布时间】:2011-11-25 20:29:26
【问题描述】:
我已经阅读了The Objective-C Programming Language 文档中的属性重新声明一章,我希望你们中的一些人可以澄清以下属性重新声明:
// MyObject.h public header file
@interface MyObject : NSObject {
NSString *language;
}
@property (readonly, copy) NSString *language;
@end
// MyObject.m private implementation file
@interface MyObject ()
@property (readwrite, copy) NSString *language;
@end
@implementation MyObject
@synthesize language;
@end
我只是想了解上面的@property和@synthesize关键字是否产生以下代码:
// MyObject.h public header file
@interface MyObject : NSObject {
NSString *language;
}
-(NSString *)language;
@end
// MyObject.m private implementation file
@interface MyObject ()
-(void)setLanguage: (NSString *) aString;
@end
@implementation MyObject
-(NSString *)language {
return language;
}
-(void)setLanguage: (NSString *) aString {
[language release];
language = [aString copy];
}
@end
所以,编译器会看到第一个 @property 声明并在公共接口中添加一个 getter 方法......然后,当涉及到实现文件时,它会为同一属性找到另一个 @property 声明但是在私有接口中具有 readwrite 属性,并且只添加了一个 setter 方法,因为 getter 已经添加到公共接口中。然后,找到 @synthesize 关键字并将两个实现都添加到私有实现部分中。复制第一个 @property 声明的属性不是必需的,因为那里不需要 setter,但我们必须指定它以与第二个属性重新声明一致。我的想法对吗?
【问题讨论】:
-
几乎,但由于您没有指定
nonatomic,因此 setter 和 getter 代码同步为线程安全。 -
是的,你是对的,我只是没有考虑那个重要的事情,因为我专注于重新声明的疑问,而不是严格地关注
@synthesize实现 getter 和 setter 方法的方式。顺便说一句,谢谢你指出来;-)
标签: objective-c properties redeclaration