我在Objective-C中有一些关于变量/对象声明的问题,我希望能更好地理解一些事情。
我知道给一个变量@property
声明允许你从其他类访问它,如果你不打算在它自己的类之外使用它,这有什么用吗?
我经常在示例代码中看到变量和对象仅使用@property
声明,而不是直接在@interface
声明。为什么呢?
我在使用@synthesize
时也看到了人,做var = _var;
之类的事情。怎么来的?
在引用对象和变量时,是否有任何理由,例如self.var.
而不是var.
?
答案 0 :(得分:3)
@property并合成,即使是私下使用,也可以预先构建 吸气剂和二传手。这就是我使用它们的原因。
在最近的Xcode中,你得到了一个为你提供的合成,所以你 @synthesize可以单独处理@property。
下划线别名允许您将堆栈变量命名为相同 含糊不清,例如......
// say my class contains a property called foo, alias _foo.
- (void)initWithFoo:(id)foo {
self = [self init];
if (self) {
_foo = foo; // assign the param to the instance var
}
return self;
}
在init和之外使用getter和setter是一个好习惯 dealloc的。吸气者和制定者“掐断”访问 属性到您可能想要添加行为的单个位置。 例如,通常的做法是将getter用作惰性 初始化程序......
// this code assumes ARC, otherwise for retained properties without arc, you'll need to add release and retain code here and if you replace the default setter
- (SomeType *)bar {
if (!_bar) {
_bar = [[SomeType alloc] init];
}
return _bar;
}
答案 1 :(得分:2)
_var
)之外,该变量的名称将与您的属性相同。使用self.var
将使用访问者方法(无论是否自动添加,或者您自己实现)。例如,如果你想懒惰地加载一个对象,你可以自己实现一个getter来检查对象是否已经存在,如果没有则创建它,然后返回它:
// Assuming you defined @property (nonatomic) MyClass *var; in the header
- (MyClass *)var {
if (!_var) {
_var = [[MyClass alloc] init];
}
return _var;
}
现在您可以使用点语法访问它:
[self.var doSomething];
这将调用上面定义的getter。如果变量是nil
(尚未使用),则首先对其进行初始化。如果您刚刚使用了实例变量...
[_var doSomething];
...你会得到不同的结果。如果_var
为nil
,则会忽略该消息(无错误,崩溃)。这是因为您直接访问变量,而不是通过访问器方法。当然,如果您确定该对象将被初始化,或者在nil
处理该情况,那么您可以直接使用它。
答案 2 :(得分:1)
@property
时,您可以避免编写“样板”代码,例如复制或锁定以使访问原子化。随着ARC的推出,这一功能的重要性大大降低。@synthesize
,您可以使用很少或不需要额外编码的属性。由于属性比变量更具“未来证明”,因为您可以在getter中的setter和计算中执行验证,因此您几乎没有理由使用“普通”变量。@synthesize
。如果您看到很多@synthesize
,那么您可能正在阅读“旧代码”(超过6个月)。@synthesize
或隐式使用最新的Xcode。