@mmalc'sresponsethis question中,他说"一般来说,您应该在dealloc(或init)中使用访问器方法."mmalc为什么这么说?

我能想到的唯一真正的原因是性能和避免@dynamic setters的未知副作用.

讨论

推荐答案

这一切都是关于使用习惯一致的代码.如果您对所有代码进行了适当的模式化,那么有一组规则可以保证在init/dealloc中使用访问器是安全的.

最大的问题是(正如mmalc所说)设置属性默认状态的代码不应该通过访问器,因为它会导致各种各样的棘手问题.关键是init没有理由设置属性的默认状态.出于许多原因,我一直在转向自初始化的访问器,如下面的简单示例:

- (NSMutableDictionary *) myMutableDict {
    if (!myMutableDict) {
        myMutableDict = [[NSMutableDictionary alloc] init];
    }

    return myMutableDict;
}

这种类型的属性初始化允许延迟许多实际上可能不必要的初始化代码.在上述情况下,init不负责初始化属性状态,在init方法中使用访问器是完全安全的(甚至是必要的).

诚然,这会对代码施加额外的限制,例如,对于超类中的属性,具有自定义访问器的子类必须调用超类访问器,但这些限制与Cocoa中常见的其他各种限制并不冲突.

Objective-c相关问答推荐

多个 WKWebView 之间的 Cookie 共享

ios 使用 AVFramework 捕获图像

NSError 和 __autoreleasing

多个(两个)持久存储可以与一个对象模型一起使用,同时保持一个到另一个的关系吗?

使用 [NSBundle mainBundle] pathForResource: ofType:inDirectory: 访问文件

如何以编程方式暂停 NSTimer?

动态转发: suppress Incomplete Implementation 警告

接口类型不能静态分配?

进入编辑模式时动画自定义绘制的 UITableViewCell

iOS 5:对 UIAppearance 感到好奇

如何以编程方式移动 UIScrollView 以集中在键盘上方的控件中?

#ifdef DEBUG 与 #if DEBUG

NSMutableArray 按顺序添加对象

判断是否已实现可选协议方法

如何检测 NSString 是否为空?

[NSMutableArray array] 与 [[NSMutableArray alloc] init] 之间的区别

@dynamic 在 Objective-C 中做了什么?

如何实现全局 iPhone 异常处理?

无法在 iOS7 上将 UITextField 添加到 UIAlertView ...在 iOS 6 中有效

在 iOS 6.0 的 Xcode 4.5 中我没有要求的日志(log)消息