在 Objective-C 中,使用属性时是否需要声明实例变量?

4

在 Obj-C 中,我们需要声明实例变量吗?

例如,如果我的 .h 文件如下:

@interface MyClass : NSObject {
}

@property (nonatomic, retain) NSNumber *someId;
@property (nonatomic, retain) NSDate *expires;
@property (nonatomic, retain) NSString *someString;

...

这样可以吗?它可以编译和运行,是“正确的”做法吗?还是我真的应该像下面这样做:

@interface MyClass : NSObject {
    NSNumber *someId;
    NSDate *expires;
    NSString *someString;
}

@property (nonatomic, retain) NSNumber *someId;
@property (nonatomic, retain) NSDate *expires;
@property (nonatomic, retain) NSString *someString;

...

如果我计划始终使用属性访问器,上述两种方式有区别吗?

@synthesize是否为我创建实例变量?


请在发布问题前搜索1 2 3 4 5相关内容。 - jscs
2个回答

5
您理解得没错,@synthesize 会为您创建 ivars。(这是运行时的一个新功能,与 64 位 Mac 和 iOS 设备兼容。)
好处在于,您可以在class extension中使用 @property,并从 .h 中完全隐藏 ivars,将接口和实现彻底分离。
您还可以完全从 .h 中删除 '{}',使它变得非常干净。

如果我这样做,会阻止我访问我的.m文件中的ivar吗?我想被强制使用属性,例如'self.blah'。 - Chris
不,如果你觉得有必要,仍然可以访问原始的ivar。 - Joshua Weinberg
2
您仍然可以使用类似于 @synthesize myProp = _myProp 的语句来重命名 iVar,以防止意外使用而没有 getter。iVar 将被命名为 _myProp。 - Kendall Helmstetter Gelner

1
在苹果文档中找到了这个:
使用现代运行时,如果您没有提供实例变量,编译器会为您添加一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接