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

CIF*_*ter 9 properties objective-c instance-variables

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

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

例如,我倾向于做以下事情:

MyClass.h:

@interface MyClass : NSObject

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

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

除了代码风格首选项,是否有任何问题,完全避免像这样的ivars?

CIF*_*ter 7

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