【问题标题】:Is a synthesized property already alloc/init -ed?合成属性是否已经 alloc/init -ed?
【发布时间】:2011-03-30 03:24:42
【问题描述】:

如果我有一个名为 ProgramModel 的自定义 NSObject 类,当我从另一个类中 @property@synthesize 它时,它会得到 alloc/init 吗? 例如,在这样的 ProgramController 类中

// ProgramController.h
#import "ProgramModel.h"
@interface ProgramController : UIViewController {
    ProgramModel *programModel;
}
@property (nonatomic, retain) ProgramModel *programModel;

// ProgramController.m
#import "ProgramController.h"
@implementation ProgramController
@synthesize programModel;
// etc

我还需要在initWithNibNameviewDidLoad 中分配/初始化,还是因为property/synthesize 而已经alloc/init-ed?

【问题讨论】:

    标签: iphone objective-c properties


    【解决方案1】:

    您需要手动填充该属性。例外情况是,如果您在 nib 文件中连接了 IBOutlet property;加载笔尖时会自动填充。

    我发现对于视图控制器,绝大多数属性是IBOutlets 和描述视图将显示什么的属性,而后一种情况通常由创建视图控制器的对象设置。对于显示某个对象的详细视图的视图控制器,通常就是这种情况。

    如果你确实有完全在视图控制器本地的属性,一个常见的模式是编写你自己的 getter 和 setter(而不是使用@synthesize)并在 getter 中创建不存在的对象。这种延迟加载行为意味着您可以在内存不足的情况下轻松释放资源,并且您只需在需要时支付加载对象的成本。

    // simple lazy-loading getter
    -(MyPropertyClass*)propertyName {
        if(propertyIvarName == nil) {
            propertyIvarName = [[MyPropertyClass alloc] init];
            // ... other setup here
        }
        return propertyIvarName;
    }
    

    【讨论】:

    • 技术上在加载 nib 之前,出口是 nil,在调用 [controller window] 或 @ 之前(在 NSWindow/ViewController 的情况下)不会发生987654327@.
    • 我不确定你在这里画的区别是什么。我确实说过“当笔尖被加载时”......
    • @Seamus 是的,我只是想澄清一下,加载笔尖不一定在初始化期间发生。我被咬了很多次,因为我还没有装笔尖,所以试图访问不存在的插座。
    • -1 在-init 中分配属性通常更合适,因为在整个对象生命周期中可以多次调用-viewDidLoad,并且视图可能不会立即加载。 “模型”属性绝对应该与控制器的生命周期相关联,而不是视图的生命周期。
    • 当然,延迟加载只适用于使用大量内存的东西;)
    【解决方案2】:

    默认情况下,所有实例变量都归零。对于对象,这意味着它们是nil。如果你想在属性中设置一个初始值,你需要在你的 initializer/viewDidLoad 方法中把它放在那里。

    【讨论】:

      【解决方案3】:
      • @property 只声明 getter/setter 方法。
      • @synthesize 只会为您生成访问器。

      除了内存被清零外,它们不会自动分配值。此外,您必须在 -dealloc 中将它们设置为 nil 以避免泄漏。

      “分配属性”也没有意义。对象属性是一个指针。 (想想如果你有一个链表类会发生什么......)

      (注意:属性属性也会影响@synthesized 方法,属性也为运行时所知;请参阅 class_copyPropertyList() 和朋友。)

      【讨论】:

        猜你喜欢
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        相关资源
        最近更新 更多