2013-02-26 70 views
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; 
} 
+0

你必須使用指針指針來允許'initTextView'方法改變'_myTextView'的值。看到我的答案下面的工作示例。 – 2013-02-26 10:37:43

回答

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方法預計將表現得像在ARC其他init方法。

+0

爲什麼在指針指向時使用指針指針有一個非常好的回報值無所作爲? – trojanfoe 2013-02-26 10:52:19

+0

問題是如何間接初始化實例變量。分配方法的返回值將是直接訪問,因此不能回答問題。 – 2013-02-26 10:57:53

+0

垃圾。無論哪種方法初始化實例變量,但使用指針指針都容易出錯,過於複雜和難看。 – trojanfoe 2013-02-26 10:59:19

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 
    ... 
} 
+0

是的,這是有效的,但我需要調用initTextView幾個文本視圖,我試圖避免代碼重複。 – MdaG 2013-02-26 10:28:18

+0

@MdaG看看我的更新 – 2013-02-26 10:31:23

3

您需要使用始終引用實例變量:

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

也可以使用除initTextView以外的名稱作爲從init開始的方法specia l在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]; 
    } 
} 
+3

這對於帶有'LLVM'的最新版本的Xcode不再需要。 – rckoenes 2013-02-26 10:25:43

+0

@MdaG我已經用一個使用方法初始化多個文本視圖的示例更新了我的答案。 – trojanfoe 2013-02-26 10:33:44

+0

你仍然不需要''用'LLVM'編譯器''綜合''''''' – rckoenes 2013-02-26 10:34:50

相關問題