我能间接发起一次伊娃吗?

时间:2013-02-26 10:18:23

标签: objective-c xcode automatic-ref-counting

我正试图像这样启动我的ivar:

在h-file

中声明如下
@interface MyClass: {
    UITextView *_myTextView;
}

然后在m文件中创建

- (id)init {
    self = [super init];
    if(self) {
        [self initTextView:_myTextView];
    }
    return self;
}

- (void)initTextView:(UITextView *)textView {
    textView = [[UITextView alloc] init];
    ...
}
之后

_myTextView仍然是零。 为什么这样做以及我该怎么做才能使它工作?我已经启用了ARC。

[编辑]

这很有效。谢谢大家!

- (id)init {
    self = [super init];
    if (self) {
        _textView1 = [self createTextView];
        _textView2 = [self createTextView];
        _textView3 = [self createTextView];
    }
    return self;
}

- (UITextView *)createTextView {
    UITextView *textView = [[UITextView alloc] init];
    ...
    return textView;
}

3 个答案:

答案 0 :(得分:3)

您需要始终使用以下方式引用实例变量:

self.textView = [[UITextView alloc] init];

同样使用initTextView以外的名称作为以init开头的方法在Objective-C中具有特殊含义。

如果要使用相同的代码初始化多个文本视图控件,请使用以下代码:

- (UITextView *)createTextView
{
    UITextView *textView = [[UITextView alloc] init];
    textView.something = whatever;
    ...
    return textView;
}

然后像这样使用它:

- (id)init {
    self = [super init];
    if(self)
    {
        self.textView1 = [self createTextView];
        self.textView2 = [self createTextView];
        ...
        self.textViewN = [self createTextView];
    }
}

答案 1 :(得分:1)

- (id)init {
    self = [super init];
    if(self) {
        [self initTextView];
    }
}

- (void)initTextView{
    _myTextView = [[UITextView alloc] init];
    ...
}

如果你想为几个文本视图调用initTextView,你可以这样编码:

- (id)init {
    self = [super init];
    if(self) {
        _myTextView = [[UITextView alloc] init];
        [self initTextView:_myTextView];
    }
}

- (void)initTextView:(UITextView *)textView{
    //setup the textView
    ...
}

答案 2 :(得分:1)

[self initTextView:_myTextView];中,您将_myTextView的当前值(即nil)传递给initTextView:方法。要设置实例变量,需要指向指针的指针。

- (id)init {
    self = [super init];
    if (self) {
        [self setupTextView:&_myTextView];
    }
    return self;
}

- (void)setupTextView:(UITextView * __strong *)textView {
    *textView = [[UITextView alloc] init];
    ...
}

我还将initTextView:方法重命名为setupTextView,因为从init开始的方法预计会像ARC中的其他init方法一样。