Readonly公共财产在私人界面中重新声明为readwrite ..了解更多

时间:2011-09-27 08:45:51

标签: objective-c properties redeclaration

我已阅读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,但我们必须指定它与第二个属性重新声明一致。我的想法是对的吗?

1 个答案:

答案 0 :(得分:3)

是的,您的理解是正确的。

另请注意,Objective-C中没有严格的私有方法。外部呼叫者仍然可以呼叫setLanguage:。编译器将输出警告,但消息将在运行时通过。

相关问题