ios - 属性及其支持的ivars

标签 ios objective-c

嗨,假设我在 .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 的任何子类覆盖,这可能会使对象处于不一致的状态。

另请参阅:Why would you use an ivar?

关于ios - 属性及其支持的ivars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17897583/

相关文章:

ios - 从自定义 UITableViewCell 中的某些文本字段获取字符串

ios - videoMaximumDuration 不限制持续时间

iphone - 在内部类中引用 iVar 时出现问题

ios - 从另一个应用程序连接到蓝牙设备

objective-c - AFNetworking POST 请求向服务器发送空白参数

objective-c - %qx 格式说明符是什么意思

iphone - 获取请求返回一个对象数组 - NSFetchedResultsController 返回 null

ios - 我会在预装应用程序上获得搜索广告归因数据吗?

ios - iOS App场景中的安全 key ,安全吗?

ios - 无法将 Lottie 动画 View 添加到 Collection View 单元格