为什么不声明实例变量?

Bre*_*den 1 warnings compiler-errors objective-c ios

我正在使用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
Run Code Online (Sandbox Code Playgroud)

1)使用未声明的标识符'string'

我还在WWDC 2010 Session 144中看到了以下内容:

return self->string;
Run Code Online (Sandbox Code Playgroud)

但是这给出了一个错误,建议使用点符号.

2)在'Test*'类型的对象上找到属性'string'; 你的意思是用"."来访问它.运营商?

我也收到警告number:

3)属性'number'需要定义方法'number' - 使用@synthesize,@ dynamic或在这个类实现中提供方法实现

我完全迷失了这里发生的事情.它开始煮沸我的血液一点点.我错过了什么?

Mis*_*Moo 5

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

其次,当你尝试使用时,->你必须访问ivar.在最新版本的Xcode和LLVM中,如果您未指定自己使用的ivar,则会为您创建带有下划线的ivar @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;
}
Run Code Online (Sandbox Code Playgroud)

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