【发布时间】:2015-09-04 19:13:39
【问题描述】:
我在 stackoverflow 和许多其他网站上查找了我当前的问题,但老实说我有点困惑。我应该只在另一个类需要访问它时使用属性,而当它仅用于我的私有类时使用 ivars 吗?这就是我到目前为止所得到的,尽管我确实听到了一些关于何时使用 ivars 和属性的其他信息。我只是想保持我的代码干净和更现代。任何澄清将不胜感激。
【问题讨论】:
标签: objective-c properties ivar
我在 stackoverflow 和许多其他网站上查找了我当前的问题,但老实说我有点困惑。我应该只在另一个类需要访问它时使用属性,而当它仅用于我的私有类时使用 ivars 吗?这就是我到目前为止所得到的,尽管我确实听到了一些关于何时使用 ivars 和属性的其他信息。我只是想保持我的代码干净和更现代。任何澄清将不胜感激。
【问题讨论】:
标签: objective-c properties ivar
这是一个非常基于意见的话题。所以我试图坚持无争议的事实和建议:
NSString、NSArray 等人的正确所有权处理。 (copy)。atomic)。在实现中是否使用 ivars 的实际决定是个人喜好问题。它受到代码风格的许多微妙细节的影响。
【讨论】:
self 发送消息。我相信这是一个很好的论据,你不知道。我想,继续这个讨论是没有意义的,尼古拉如禾说得对:固执己见。附言请使用@来呼叫你的对手,否则他/她不会收到通知。此外,Alan Kay 创建了 Smalltalk,而不是 Obj-C。而且你不是世界上唯一一个阅读 Clang 文档的人。而且 Clang 并不是唯一的 Obj-C 编译器。不过,感谢您的对话。
在我看来 - 如果你没有覆盖 getter 和 setter,你应该只使用由 ivar 支持的属性。
你应该在公共接口中声明它们以使其成为公共,并在私有接口中声明它们以使其成为私有。
这样做有很多优点,其中一些是:
在您的班级中,您应该几乎始终通过 getter/setter 访问您的属性,除非:
下面是一个例子,说明以下几点:
@interface SomeObject : NSObject
@property (strong, nonatomic) NSMutableArray * objects;
@property (readonly, nonatomic, getter=isActive) BOOL active; // Public read-only
@end
@interface SomeObject()
@property (readwrite, nonatomic, getter=isActive) BOOL active; // Can be updated internally
@property (nonatomic, getter=isVisible) BOOL visible;
@end
@implementation SomeObject
- (NSMutableArray)objects {
if (!_objects) {
_objects = [NSMutableArray array]; // Lazy instantiate when first accessed
}
return _objects;
}
- (BOOL)isActive {
return _isActive && self.isVisible; // Cannot be active if not visible
}
- (BOOL)setActive:(BOOL)active {
self.visible = active; // Keep visibility same as active
_active = active;
}
-(BOO)setVisible:(BOOL)visible {
_visible = visible;
// perform animation or something else...
}
@end
任何这些都不能使用 ivars 来实现。
【讨论】:
你应该在你的类内外使用声明的属性。大多数开发人员说您应该只在初始化程序中将 ivar 设置在属性后面。 (我不同意,在这种情况下也使用 setter 和 getter,但我是少数。)
【讨论】:
Don’t Use Accessor Methods in Initializer Methods and dealloc。
NSView。然而,遵循规则而不给出理由永远不能证明除了没有自己的大脑之外。