2009-04-25 20 views
1

私はプログラミングをして以来、ずっとずっと続いていました。 'ok'にC & C++を読むのに使われました。基本的なObjective-Cの質問...私を夢中にする

私は、(NSMutableArrayを使用して)配列の内容を操作するために使用したい非常に単純なクラスを持っています。配列はオブジェクトとして保持する必要がありますので、プログラムの実行中に複数の更新を行うことができます(まだ状態データをディスクに保存することを心配していません)。

これは私の問題です。 Alloc/Init my Arrayオブジェクトをいつどこで/いつ実行すれば、iPhoneのビューでボタンをクリックするたびに使用可能な状態になるのかはわかりません。

インスタンス変数として配列を含むViewControllerのサブクラスを作成しようとしていますが、これはビューからのボタンクリックに応答するコードで参照できます。私は3つのアプローチを試しました

  1. 私は同じクラスの一部として記述したメソッドで配列インスタンス変数を参照しようとしました。このバージョンのコードでは、Alloc/Initはどこにもありません。 addObject関数を呼び出すと、配列オブジェクトが割り当てられていない/初期化されていないために失敗したように見えます。

  2. 私はまた、viewWillDisplayメソッドで配列オブジェクトのインスタンスをAlloc/Initしようとしました。 Xcodeコンパイラは、私の新しく割り当てられたオブジェクトが使用されることはないという文句を言います。

  3. キックの場合、私は「ボタンクリック」メソッドの範囲内でalloc/initを行っていますが、私のボタンをクリックするたびに新しいインスタンスが割り当てられます。ここで

が、私は私の例のための .h.mファイルに持っているもので、誰かがGIANTの空白を埋めることができれば

は本当にそれをお願い申し上げ、私は明らかに持っている(これは、シナリオ1を示します) Instance Variableオブジェクトをどのように使用するのかを私が理解しています。 (私はOBJの-C..etc上のリンゴのドキュメントの多種多様を読んでも説明を見つけることを試みる私の頭脳をググ

.H:。。

#import <UIKit/UIKit.h> 

@interface ArrayManagerViewController : UIViewController { 
    NSMutableArray *buttonArray; 
} 
- (IBAction)buttonClicked:(id)sender; 

@end 

そして.M

あなたは構文、CとSmalltalkのが基本的に2つの種類を持っているので、
#import "ArrayManagerViewController.h" 

@implementation ArrayManagerViewController 

- (IBAction) buttonClicked:(id)sender { 
    NSString *senderTitle = [sender currentTitle]; 
    int intSenderTitle = [senderTitle intValue]; 
    [buttonArray insertObject:[NSString stringWithFormat:@"%d", 
                 intSenderTitle] 
         atIndex:intSenderTitle]; 

    for (id obj in buttonArray) 
     NSLog(@"Object Value %@", obj); 
} 
+0

を書き始める前に、developer.apple.com上にObjCの基礎とココアのメモリ管理をお読みください。グローバル配列やシングルトンを作成する方法を知りたいですか? –

答えて

1

さて、Objective Cのは少しいらいらすることができます。あなたは

buttonArray = [[NSMutableArray alloc] init] ; 
のようなコードに何かを使用して配列を作成する必要があります210

素敵な軽量チュートリアルhereがあります。

3

ArrayがViewControllerの全期間使用されている場合、おそらくArrayManagerViewControllerのinit(override)メソッドで配列を割り当て/初期化し、deallocのオーバーライドでreleaseを呼び出すことができます。

@implementation ArrayManagerViewController 

- (ArrayManagerViewController *) init 
{ 
    if (self = [super init]) 
    { 
     [[buttonArray alloc] init]; 
    } 

    // handle errors... 

    return self; 
} 

- (void)dealloc 
{ 
    [buttonArray release]; 
    [super dealloc]; 
} 

// other methods 

@end 
あなたは、コンストラクタであなたのUIViewControllerは、(通常)である初期化

メッセージをインスタンス変数を初期化しなければならないことを知っている必要があり

+0

私はhellra1serがより正確だと思います.ViewControllerは通常、上記のものよりも "init"のより具体的なバージョンを持っています。私はちょうどこれを行う方法の一般的なアイデアを伝えたいと思っていました。 –

1

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

ので、実装は次のようになります

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
     buttonArray = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

deallocメッセージでボタン配列を解放することを忘れないでください。

- (void) dealloc { 
    [buttonsArray release]; 
    [super dealloc]; 
} 

P.S.:just、私はあなたの質問を理解していないコード

+0

あなたの答えは正しいです、あなたが持っているよりも具体的なバージョンのinitがあります。 –