1

我正在尝试像这样启动我的 ivar:

在 h 文件中这样声明

@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;
}
4

3 回答 3

3

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

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

也可以使用其他名称,而不是作为以在 Objective-C 中具有特殊含义的initTextView方法开头。init

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

- (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];
    }
}
于 2013-02-26T10:25:08.030 回答
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
    ...
}
于 2013-02-26T10:24:22.443 回答
1

[self initTextView:_myTextView];您将 _myTextView 的当前值(为零)传递给您的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预计与initARC 中的其他方法一样。

于 2013-02-26T10:33:10.217 回答