6

我知道从 iOS 4 开始,现在可以完全不声明 iVar,并允许编译器在您合成属性时自动为您创建它们。但是,我找不到 Apple 提供的有关此功能的任何文档。

此外,是否有任何关于使用 iVar 和属性的最佳实践或 Apple 推荐指南的文档?我一直使用这样的属性:

.h 文件

@interface myClass {
    NSIndexPath *_indexPath
}

@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m 文件

@implementation myClass

@synthesize indexPath = _indexPath;

- (void)dealloc {
    [_indexPath release];
}
@end

我使用 _indexPath 而不是 indexPath 作为我的 iVar 名称,以确保indexPath在需要使用self.indexPath. 但是现在 iOS 支持自动属性,我不需要担心这个。但是,如果我遗漏了 iVar 声明,我应该如何处理在我的 dealloc 中释放它?我被教导在 dealloc 中释放时直接使用 iVar,而不是使用属性方法。如果我在设计时没有 iVar,我可以只调用属性方法吗?

4

3 回答 3

6

我经历了许多不同的方式来处理这个问题。我目前的方法是使用dealloc中的属性访问。不这样做的原因(在我看来)太做作了,除非我知道该物业有奇怪的行为。

@interface Class
@property (nonatomic, retain) id prop;
@end

@implementation Class
@synthesize prop;

- (void)dealloc;
{
    self.prop = nil;
    //[prop release], prop=nil; works as well, even without doing an explicit iVar
    [super dealloc];
}
@end
于 2011-03-17T18:59:09.870 回答
5

相反,我执行以下操作:

@interface SomeViewController : UIViewController

@property (nonatomic, copy) NSString *someString;

@end

进而

@implementation SomeViewController

@synthesize someString;

- (void)dealloc
{
    [someString release], someString = nil;
    self.someString = nil; // Needed?

    [super dealloc];
}

@end

注意:在某些时候,Apple 将启用默认合成,这将不再需要 @synthesize 指令。

于 2011-03-17T18:59:53.930 回答
3

->您可以使用符号而不是点直接访问实例变量.(这将调用 ivar 的相应访问器方法):

。H

@interface myClass {
}
@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m

@implementation myClass

- (void)dealloc {
    [self->indexPath release];
    self->indexPath = nil; // optional, if you need it

    [super dealloc];
}
@end

因此,您将直接访问iVar而不是它的相应访问器方法,从而获得额外的好处 - 性能。

于 2011-03-17T18:41:13.677 回答