2

以下示例说明了如何为 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文档: 内存管理示例

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

4

3 回答 3

2

这些属性通常会这样合成:

@synthesize firstName = _firstName, …;
于 2013-01-11T05:43:21.983 回答
1

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

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

另一种方法是将 ivar 命名为与属性不同的名称。一种常见的方法是使用下划线作为 ivars 名称的前缀。

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

于 2013-01-11T05:45:50.143 回答
1

当你这样做时self.firstName,你实际上是在调用 getter firstNameself.firstName = @""调用setFirstName:.

- (NSString *)firstName
{
    return _firstName;
}

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

当您编写时@sythesize firstName = _firstName,您是专门命名底层实例变量_firstName而不是firstName. 这样,您就不会意外键入firstName和绕过 setter 方法和 KVO。如果不写@synthesize,编译器会自动命名实例变量_firstName

只是个人建议——我会使用 ARC,这样你就不必处理 dealloc。

[1] Key-Value 观察是一种对象可以注册以通知属性更改的方式。它是通过@synthesize或正确命名getter的和setter方法自动提供的。

于 2013-01-11T05:53:09.040 回答