3

假设我有两个这样定义的属性:

@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. 我可以self.parentTableView从 init 方法调用吗?
  3. 我是否可以从 init 方法调用一个方法(在这种情况下,prepareTags 方法self也会调用。self即使 init 方法尚未返回,也可以使用了吗?
4

3 回答 3

5

分别(我会使用列表格式,但我不能让它与块引用一起工作......!):

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

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

我可以self.parentTableView从该init方法调用吗?

不,引用有关实用内存管理的 Apple 文档

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

. 您应该直接访问 ivar(就像您使用 一样headersArray

我是否允许从方法调用init方法(在这种情况下,prepareTags方法也调用selfself即使init方法尚未返回,也可以使用?

是的。请非常小心(您的对象可能尚未完全初始化,它不应该使用访问器方法以符合先前的限制等)

于 2012-04-23T23:03:27.873 回答
2

这里不需要使用局部变量:

NSMutableArray *array = [[NSMutableArray alloc] init];
headersArray = array;

只需直接分配给实例变量:

headersArray = [[NSMutableArray alloc] init];

我可以从 init 方法调用 self.parentTableView 吗?

是的,尽管有些人可能会认为这种设计很糟糕。考虑这样一个事实,即属性有时具有查看其他实例变量的非显而易见的复杂 setter 方法。当您的对象尚未完全初始化时,这样做是否明智?

我可以从 init 方法调用方法吗?

和上面一样。只要您不依赖尚未初始化的任何内容,就可以了。

于 2012-04-23T23:05:03.360 回答
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;
}
于 2012-04-23T23:02:40.570 回答