如果您在Objective-C中仅使用属性,是否有任何理由声明ivars?

时间:2011-02-04 22:43:18

标签: objective-c properties instance-variables

我倾向于在我的类中专门使用属性,特别是现在您可以在类扩展中声明属性,这要归功于现代的Objective-C 2.0运行时 - 我使用此功能来创建“私有”属性。

我的问题是,是否有任何理由再次在类接口中声明ivars。我更喜欢面向公众的界面尽可能小而干净,只是揭示了我班级中相关的方面。

例如,我倾向于执行以下操作:

MyClass.h

@interface MyClass : NSObject

@property (nonatomic, copy) NSString * publicString;
@property (nonatomic, copy, readonly) NSString * readOnlyString;

@end

MyClass.m

@interface MyClass ()

@property (nonatomic, copy, readwrite) NSString * readOnlyString;
@property (nonatomic, copy) NSString * privateString;

@end

@implementation MyClass

@synthesize publicString = publicString_;
@synthesize readOnlyString = readOnlyString_;
@synthesize privateString = privateString_;

- (void)init
{
    self = [super init];

    if (self != nil)
    {
        self.publicString = @"Public String";
        self.readOnlyString = @"Read-Only String";
        self.privateString = @"Private String";
    }

    return self;
}

- (void)dealloc
{
    [publicString_ release];
    [readOnlyString_ release];
    [privateString_ release];

    [super dealloc];
}

@end

除了代码样式首选项之外,是否存在完全避免使用ivars的问题?

4 个答案:

答案 0 :(得分:7)

我可能找到了一个足以让我用ivars明确支持我的属性的答案。它看起来好像调试器不会列出任何自动合成的ivars,所以在调试期间无法直接浏览self并检查除手动调用属性访问器之外的各种值,这很繁琐。除非他们改变这一点,否则这可能足以让我回到明确宣布ivars。

答案 1 :(得分:3)

主要问题是,如果它完全困扰你,那么每Cocoa With Love个动态实例变量(例如你正在使用的那些变量)不受64位Intel / PowerPC(固定的)运行时支持。 Chuck的评论如下)和ARM(适用于iOS)。

我目前无法在此问题上找到权威的Apple文档;请注意,限制使用最新的OS X,v10.6是不够的,因为Apple可以在从PowerPC切换后立即发货的32位Intel机器上使用并支持它。

迟到的额外想法:在不知道Xcode 4中任何可能的变化的情况下,在头文件中声明其他私有实例变量的一个很好的理由是将它们标记为IBOutlets并以图形方式将它们连接起来。不过,诚然,这只与一个非常特殊的类和成员变量有关。

答案 2 :(得分:1)

我必须同意LucasTizma的调试问题。

当我开始使用XCode4时,我开始没有明确声明ivars并使用 @synthesize aVar = _aVar 语法为我创建它们。在尝试调试代码时,我注意到我无法将光标悬停在变量上并查看其值。

对我来说,这是不可接受的。我想它会明确地宣布它们。

答案 3 :(得分:0)

除了Tommy的关注之外,宣布ivar当然是一种很好的做法,特别是如果您的代码可能被重用或者您可能会在某个时候回到您的代码中。