0

可能重复:
可可objective-c 类中变量前面的下划线如何工作?
self.ivar 和 ivar 之间的区别?
带下划线前缀的综合属性和变量:这是什么意思?

要在对象 c 中使用属性,我有两种选择,我应该使用哪一种?

选择1:self.property = xxxx;

选择2:_property = xxx

例如:

//.h file

@interface ViewController : UIViewController

    @property (retain, nonatomic) NSArray *myArray;

@end

//.m file

@interfaceViewController ()

@end

@implementation ViewController

- (void)doing {

    _myArray = [[NSArray alloc] init]; //choice one
    self.myArray = [[NSArray alloc] init]; //choice two
}
@end
4

2 回答 2

2

你正在做两件完全不同的事情。

_myVar = [[NSArray alloc] init];

在上面的代码中,您直接访问变量。

self.myVar = [[NSArray alloc] init];

在上面的代码中,您调用的是 setter 方法,相当于

[self setMyVar:[[NSArray alloc] init]];

通常 setter(连同 getter)提供内存管理和同步功能,因此使用它更可取且通常更安全,而不是直接访问 ivar。

下划线语法只是一个约定,不要混淆 ivar 和属性,因为一个典型的错误是错误地使用它并意外使用myVar代替self.myVar. 使用下划线语法是为了阻止这种不良做法。

于 2012-12-17T03:50:29.593 回答
0

我知道这个问题很常见,但无论如何我都会回答。

下划线语法访问支持属性的实例变量,而点语法只是附属方法的包装器:

object.property == [object property]
object.property = x == [object setProperty:x]

因此,您应该尽可能使用点语法或附件方法,以确保一切都得到照顾。例如非 ARC 应用程序中的垃圾收集。您必须将实例变量用于初始化、解除分配或自定义附件方法等事情,但这些都是特殊情况。要获得详细的概述,请阅读 Objective-C 手册中关于属性的章节:https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/ doc/uid/TP40011210-CH5-SW1

于 2012-12-17T03:50:12.760 回答