为什么要使用下划线?

时间:2013-01-11 05:40:52

标签: objective-c

以下示例说明了如何为Person类实现dealloc方法:

@interface Person : NSObject
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
@property (assign, readonly) NSString *fullName;
@end

@implementation Person
// ...
- (void)dealloc
    [_firstName release];
    [_lastName  release];
    [super      dealloc];
}
@end

以上内容来自Apple文档: memory management example

我的问题是为什么在dealloc中的firstName和lastName之前有下划线?

3 个答案:

答案 0 :(得分:2)

通常会合成属性:

@synthesize firstName = _firstName, …;

答案 1 :(得分:1)

方法::默认情况下,在合成getter和setter访问器方法时,假定属性和ivar具有相同的名称。

这可能会让您在使用getter / setter方法时以及何时直接访问ivar时会感到困惑。

替代方案是将ivar命名为与财产不同。一种常见的方法是使用下划线作为ivars名称的前缀。

您可以参考此链接:http://useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html

答案 2 :(得分:1)

执行self.firstName时,您实际上正在调用getter firstNameself.firstName = @""调用setFirstName:也是如此。那些getter和setter方法实际上访问了底层实例变量,像这样:

- (NSString *)firstName
{
    return _firstName;
}

当你执行_firstName时,你直接访问实例变量而不通过setter。人们在initdealloc期间直接访问实例变量的原因是setter方法或观察[1]属性的对象可以运行代码。这可能很糟糕,因为对象可能还没有完成初始化(在init中),或者某些属性已经被释放(在dealloc中)。

当您编写@sythesize firstName = _firstName时,您将专门命名基础实例变量_firstName而不是firstName。这样,您不会意外地键入firstName并绕过setter方法&志愿。如果不编写@synthesize,编译器会自动命名实例变量_firstName

只是个人推荐 - 我会使用ARC,这样你就不必处理dealloc了。

[1]键值观察是一种对象可以注册以通知属性更改的方式。它会通过@synthesize或正确命名的gettersetter方法自动提供。