问题 在@implementation中添加ivars


为了良好的封装,体面 Objective-C 程序员把他们的 private ivars私人 extension 在主实现文件中声明,如下所示:

// MyClass.m

@interface MyClass () {
    float value;
}
@end

@implementation MyClass
@end

但最近,我发现了一种更简单的隐藏方式 private ivars:ivars可以在a {} 阻止跟随 @implementation, 喜欢这个:

// MyClass.m

@implementation MyClass {
    float value;
}
@end

没有私人方法,它只是非常方便 private 需要隐藏ivars。

但是,我不确定它的语法有效性。任何人都可以使用一些规范引用来验证或使其无效吗?


7120
2018-01-13 16:12


起源



答案:


这是完全有效的,这是苹果公司谈论它的文件:

我不亲自使用它,因为我更喜欢类继续类别的语法。


11
2018-01-13 16:18



链接坏了。 :P - cHao
@cHao是苹果在某些时候更新了他们的链接结构,并从SO帖子中打破了许多旧的链接。至少可以说是烦人的。 - Brynjar
这是更新的链接: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/...  - 在页面下方查找子标题“您可以在没有属性的情况下定义实例变量”。 - jowie
@jowie - 谢谢,更新。 - mattjgalloway


答案:


这是完全有效的,这是苹果公司谈论它的文件:

我不亲自使用它,因为我更喜欢类继续类别的语法。


11
2018-01-13 16:18



链接坏了。 :P - cHao
@cHao是苹果在某些时候更新了他们的链接结构,并从SO帖子中打破了许多旧的链接。至少可以说是烦人的。 - Brynjar
这是更新的链接: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/...  - 在页面下方查找子标题“您可以在没有属性的情况下定义实例变量”。 - jowie
@jowie - 谢谢,更新。 - mattjgalloway


我对此也很好奇。 这是Apple的更新链接

您可以定义没有属性的实例变量

最好在需要跟踪值或其他对象时在对象上使用属性。

如果确实需要定义自己的实例变量而不声明属性,可以将它们添加到类接口或实现顶部的大括号内,如下所示:

@interface SomeClass : NSObject {
    NSString *_myNonPropertyInstanceVariable;
}
...
@end

@implementation SomeClass {
    NSString *_anotherCustomInstanceVariable;
}
...
@end

3
2018-06-06 09:17