如果我有一个名为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
我还需要在initWithNibName
或viewDidLoad
中分配/ init,还是因为alloc/init
而已经property/synthesize
编辑了?
答案 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()和朋友。)