【问题标题】:Readonly public property redeclared as readwrite in private interface.. understanding a bit moreReadonly 公共属性在私有接口中重新声明为 readwrite .. 了解更多
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 好的,它根本没有暴露在公共接口中,所以你(使用该类的开发人员)不应该调用 setter 方法,但运行时仍然能够传递消息,因为相应的方法已为该类有效实施。谢谢您的澄清。
  • 在单元测试中调用私有方法的能力非常有用的一个领域。
猜你喜欢
  • 1970-01-01
  • 2013-08-09
  • 2014-09-07
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2012-09-05
相关资源
最近更新 更多