0

我在名为 myViewController 的 .h 文件中创建了一个 UIViewController。

我应该在 .m 文件中使用 self.myViewController 还是 _myViewController 引用它(使用该名称自动合成)。

这是个人喜好还是两者之间有什么区别?如果是这样,有什么区别?

很抱歉问了一个奇怪的问题,但我不知道如何用谷歌搜索。

4

1 回答 1

1

基本

使用点语法与使用自动合成的下划线前缀的实例变量完全不同!

当你在一个类中声明一个属性(比如说nametype 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.

或者你可以实现你自己的namesetName:方法(或者只是一个),但是你必须自己分配值(在setter中)并且你必须自己复制它,如果属性的属性是copy;如果您的属性应该是原子的,则必须由您等实现。

那么用什么呢?

在 ARC 之前,您应该始终使用点表示法,它实际上调用了两个生成的方法之一,因为在那里为您实现了保留/释放内存管理。而且我认为您仍然应该使用属性,因为这样您就可以

  • 轻松实现延迟初始化
  • 您可以轻松地获得线程安全(只需不在nonatomic您的属性中指定)
  • 还有很多其他的东西……</li>

编辑

正如 Catfish_Man 在评论中指出的那样,atomic属性不能保证线程安全

于 2013-07-09T18:22:37.933 回答