1

我正在使用 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 或在此类实现中提供方法实现

我完全不知道这里发生了什么。它开始让我的血液有点沸腾。我错过了什么?

4

2 回答 2

5

首先,点符号是你的朋友!

其次,当您尝试使用时,->您必须访问 ivar。在最新版本的 Xcode 和 LLVM 中,如果您自己没有使用@synthesize.

所以你会这样做self->_string。当您使用.推荐时,您可以访问该属性。这也可能是您收到警告的原因number,因为self->number不存在。


编辑:针对您正在使用的事实,NSManagedObject我绝对推荐使用属性(如托德推荐的)。NSManagedObjects 期望你使用@dynamic,因为 Core Data 在后台做了很多事情,Apple 建议你不要改变它。

如果您想要自定义 getter/setter,我会考虑使用以下方法的另一个 SO 问题primitive

- (NSString *)name
{
    [self willAccessValueForKey:@"name"];
    NSString *myName = [self primitiveName];
    [self didAccessValueForKey:@"name"];
    return myName;
}

当然,Apple Docs 关于此事。以及与iOS 6相关的相关问题/解决方案。

于 2013-01-15T19:46:39.730 回答
2

如果您为属性实现了 setter 和 getter 方法,则编译器假定您还负责后备存储,并且不会_string为您创建实例变量。

您可以自己手动声明它,也可以使用@synthesize string = _string;强制编译器为您声明它。后者将根据属性类型为 ivar 提供正确的内存管理语义(强、弱等)。

对于托管对象,您需要实现 MishieMoo 的答案,但这是您的 NSObject 子类没有问题中所述的 _string 变量的原因。

这里有更详细的介绍

于 2013-01-15T20:26:48.590 回答