合成属性是否已经alloc / init -ed?

时间:2010-08-15 17:29:12

标签: iphone objective-c properties

如果我有一个名为ProgramModel的自定义NSObject类,那么当我@property@synthesize来自另一个类时,它是否会获得alloc / init -ed? 例如,在像这样的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中分配/ init,还是因为alloc/init而已经property/synthesize编辑了?

3 个答案:

答案 0 :(得分:9)

您需要手动填充属性。例外情况是您在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;
}

答案 1 :(得分:6)

默认情况下,所有实例变量都为零。对于对象,这意味着它们是nil。如果您想在属性中使用初始值,则需要在初始化/ viewDidLoad方法中将其放在那里。

答案 2 :(得分:1)

  • @property仅声明getter / setter方法。
  • @synthesize仅为您生成访问者。

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

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

(N.B。:属性属性也影响@synthesized方法,运行时也知道属性;请参阅class_copyPropertyList()和朋友。)