【发布时间】:2013-01-15 19:39:46
【问题描述】:
我使用的是 xcode 4.5.2 和 LLVM 4.1。我期望我不需要合成类属性也不需要声明实例变量,但我收到的错误表明这些期望是错误的。
我的班级:
@interface Test : NSManagedObject
@property (strong, nonatomic) NSString *string;
@property (strong, nonatomic) NSString *number;
@end
@implementation Test
- (NSString*)string {
return _string;
}
@end
1) 使用未声明的标识符“字符串”
我还在 WWDC 2010 Session 144 中看到了以下内容:
return self->string;
但这会导致建议使用点表示法时出错。
2) 在“Test *”类型的对象上找到属性“string”;你的意思是用“。”访问它吗?运营商?
我也收到了number 的警告:
3) 属性 'number' 需要定义方法 'number' - 使用 @synthesize、@dynamic 或在此类实现中提供方法实现
我完全不知道这里发生了什么。它开始让我的血液有点沸腾。我错过了什么?
【问题讨论】:
-
您上面的示例代码应该可以工作。我正在使用 Xcode 4.5.2 和 LLVM 4.1 尝试您的示例。它对我来说很干净。这里没有构建问题。
-
另外,我在很多场合都有意使用了您的示例代码所显示的技术。据我了解,这是 LLVM 后期版本支持的行为。
-
啊!由于您是
NSManagedObject的子类,我想说这会使事情变得非常复杂。在这种情况下,我会严格坚持使用self.foo或[self valueForKey:@"foo"]表示法访问属性。考虑到我认为 Apple 不会对它如何在托管对象中声明其 ivars 做出任何保证,这会更安全。 -
我很确定 Apple 建议您不要覆盖
NSManagedObject子类中的属性访问器和设置器。这就是 CoreData 的魅力所在。我认为覆盖这些会自找麻烦。 -
关于“托管对象访问器方法”的 Apple 文档:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
标签: ios objective-c compiler-errors warnings