我已阅读The Objective-C Programming Language文档中的 Property redeclaration 章节,如果你们中的一些人可以向我澄清以下属性重新声明:
// 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
声明的copy属性不是必需的,因为那里不需要setter,但我们必须指定它与第二个属性重新声明一致。我的想法是对的吗?
答案 0 :(得分:3)
是的,您的理解是正确的。
另请注意,Objective-C中没有严格的私有方法。外部呼叫者仍然可以呼叫setLanguage:
。编译器将输出警告,但消息将在运行时通过。