假设我有两个属性定义如下:
@property (nonatomic, strong) UITableView *parentTableView;
@property (nonatomic, strong) NSMutableArray *headersArray;
和方法:
-(void)prepareTags;
并说我有这样的init方法:
-(id)initWithParentTableView:(UITableView*)parentTable
{
if(self = [super init])
{
//1
NSMutableArray *array = [[NSMutableArray alloc] init];
headersArray = array;
//2
self.parentTableView = parentTable;
//3
[self prepareTags];
}
return self;
}
self.parentTableView
吗?self
。即使init方法没有返回,self
也可以使用了吗?答案 0 :(得分:5)
分别(我使用列表格式,但我无法使用blockquotes ...!):
是的,但是array
变量没有意义,您可以这样做:headersArray = [[NSMutableArray alloc] init];
self.parentTableView
方法拨打init
吗?不,引用the Apple docs on Practical Memory Management:
不要在初始化方法和dealloc中使用访问器方法
。您应该直接访问ivar(与headersArray
)
init
方法调用方法(在这种情况下,prepareTags
方法也会调用self
。self
是否可以使用,甚至虽然init
方法尚未返回?是。只是要非常小心(你的对象可能没有完全初始化,它不应该使用访问器方法,以符合先前的限制,等等)
答案 1 :(得分:2)
这里不需要使用局部变量:
NSMutableArray *array = [[NSMutableArray alloc] init];
headersArray = array;
直接分配给实例变量:
headersArray = [[NSMutableArray alloc] init];
我是否可以从init方法调用self.parentTableView?
是的,虽然有些人可能会认为设计不佳。考虑这样一个事实:属性有时会有非显而易见的复杂setter方法来查看其他实例变量。当你的对象没有完全初始化时,这样做是否明智?
我是否可以从init方法调用方法?
与上述相同。只要你没有依赖任何尚未初始化的东西,那就没关系。
答案 2 :(得分:0)
代码看起来很不错。只是几个笔记......
-(id)initWithParentTableView:(UITableView*)parentTable
{
// avoid compiler warning about the assignment and the condition in the same statement
self = [super init];
if(self)
{
//1
// no need for the extra stack variable
self.headersArray = [[NSMutableArray alloc] init];
//2
// this is all fine from here
self.parentTableView = parentTable;
//3
[self prepareTags];
}
return self;
}