从init方法调用方法?

时间:2012-04-23 22:57:37

标签: iphone objective-c ios

假设我有两个属性定义如下:

@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;
}
  1. 这是在init方法中设置headers数组的正确方法吗?
  2. 我可以从init方法调用self.parentTableView吗?
  3. 我是否允许从init方法调用方法(在这种情况下,prepareTags方法也调用self。即使init方法没有返回,self也可以使用了吗?

3 个答案:

答案 0 :(得分:5)

分别(我使用列表格式,但我无法使用blockquotes ...!):

这是在init方法中设置头数组的正确方法吗?

是的,但是array变量没有意义,您可以这样做:headersArray = [[NSMutableArray alloc] init];

我可以通过self.parentTableView方法拨打init吗?

不,引用the Apple docs on Practical Memory Management

  

不要在初始化方法和dealloc中使用访问器方法

。您应该直接访问ivar(与headersArray

一样

我可以通过init方法调用方法(在这种情况下,prepareTags方法也会调用selfself是否可以使用,甚至虽然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;
}