嗨,假设我在 .h 文件中有属性:
@property (nonatomic) NSString * myText;
@property (nonatomic) SomeClass * someObj;
现在,在类实现中。
说,我没有忘记使用 synthesize,我调用了:
@synthesize myText, someObj;
现在在代码中说我忘记在属性名称之前放置 self
(并直接引用 ivar):
myText = @"Hello";
someObj = [[SomeClass alloc] init];
我的问题是:这是一个问题吗?它会导致什么问题?或者这没什么大不了的?
附言。假设我正在使用 ARC。
最佳答案
My question is: is this a problem?
这称为“直接ivar 访问”。在某些情况下,这不是问题,而是必需。 Initializers、dealloc 和 accessors (setters/getters) 是您应该直接访问 self
的 ivars 的地方。在几乎所有其他情况下,您都会偏爱访问器。
应避免直接访问 self
以外的实例的 ivar。这里的一个简单问题是您可能会在无效地址(未定义的行为)处读取或写入,这很像 C 结构。当消息对象为 nil
时,不会执行该消息的实现。
What problems can it result in?
最大的两个:
- 您不会收到这些更改的 KVO 通知
- 而且您通常会绕过提供正确语义(可以证明是合理的)的实现。这种情况下的语义可能等同于内存管理、复制、同步或状态更改的其他结果。例如,如果一个 setter 被覆盖,那么您将绕过该 setter 的任何子类覆盖,这可能会使对象处于不一致的状态。
关于ios - 属性及其支持的ivars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17897583/