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

can*_*boy 7 iphone properties objective-c

如果我有一个NSObject名为ProgramModel 的自定义类,当我@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
Run Code Online (Sandbox Code Playgroud)

我是否还需要在initWithNibName或中分配/ init viewDidLoad,或者是否已经alloc/init因为property/synthesize

Sea*_*ell 9

您需要手动填充属性.例外情况是你有一个IBOutlet property你在nib文件中连接的; 加载笔尖时会自动填充.

我发现对于视图控制器,绝大多数属性都是IBOutlets描述视图显示内容的属性,后一种情况通常由创建视图控制器的对象设置.通常情况下,视图控制器会显示某个对象的详细视图.

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

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


Dav*_*ong 6

默认情况下,所有实例变量都为零.在物体的情况下,这意味着它们nil.如果您想在属性中使用初始值,则需要在初始化程序/ viewDidLoad方法期间将其放在那里.