我在名为 myViewController 的 .h 文件中创建了一个 UIViewController。
我应该在 .m 文件中使用 self.myViewController 还是 _myViewController 引用它(使用该名称自动合成)。
这是个人喜好还是两者之间有什么区别?如果是这样,有什么区别?
很抱歉问了一个奇怪的问题,但我不知道如何用谷歌搜索。
我在名为 myViewController 的 .h 文件中创建了一个 UIViewController。
我应该在 .m 文件中使用 self.myViewController 还是 _myViewController 引用它(使用该名称自动合成)。
这是个人喜好还是两者之间有什么区别?如果是这样,有什么区别?
很抱歉问了一个奇怪的问题,但我不知道如何用谷歌搜索。
使用点语法与使用自动合成的下划线前缀的实例变量完全不同!
当你在一个类中声明一个属性(比如说name
type NSString *
)时,Person
你会隐含地得到这个:
@interface Person : NSObject
// @property (copy) NSString *name;
// Results in
- (NSString *)name;
- (void)setName:(NSString *)name;
@end
加上这些方法的实现与设置没有什么不同_name
。_name
是一个私有实例变量,它是在综合属性时创建的(显然,如果属性具有viewController
名称,则 ivar 的名称是_viewController
)。
因此,使用“点语法”会调用两个生成的方法之一,具体取决于您是赋值还是读取值。
如果您愿意,可以通过显式合成属性并分配新名称来为基础 ivar 赋予不同的名称。
@implementation Person
@synthesize name = nameOfThisPerson_ivar;
...
@end
现在您将不会_name
在代码完成中看到任何内容,但是nameOfThisPerson_ivar
.
或者你可以实现你自己的name
和setName:
方法(或者只是一个),但是你必须自己分配值(在setter中)并且你必须自己复制它,如果属性的属性是copy
;如果您的属性应该是原子的,则必须由您等实现。
在 ARC 之前,您应该始终使用点表示法,它实际上调用了两个生成的方法之一,因为在那里为您实现了保留/释放内存管理。而且我认为您仍然应该使用属性,因为这样您就可以
nonatomic
您的属性中指定)正如 Catfish_Man 在评论中指出的那样,atomic
属性不能保证线程安全