2011-01-08 13 views
2

私は目的Cを使ってiPhoneアプリを開発しています。私はクラス "list"と呼ばれるNSMutableArrayポインタを作成します。しかし、クラスAでは、私が指すオブジェクトを決して作成しません。代わりに、クラスBのクラスメソッドを呼び出して、sqliteデータベースからデータを取得し、そこにNSMutableArrayオブジェクトを設定します。私はメソッドに引数として渡すことによってクラスBメソッドで作成されたNSMutableArrayオブジェクトを指すようにクラスAのポインタを設定できるようにしたい。私はsqliteの結果を返すので、配列を返すことによってそれを行うことはできません。メソッドを使用してポインタを変更するにはどうすればよいですか?

私はこの権利をしているのだろうか?私はまだ完全な方法を書いていませんが(それはかなり長くなるでしょう)、私は残りの部分を始める前にポインタのものを正しく実行しているかどうかを知りたいのです。

//ClassA.m 

//... 
NSMutableArray *list; 
[ClassB populateArrayFromSqlite:&list]; 
//Now do stuff with "list", which should point to the array created in populateArrayFromSqlite 
//... 

//ClassB.m 
+(int)populateArrayFromSqlite:(NSMutableArray**)ar { 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    //Here there will be code that populates the array using sqlite (once I write it) 
    //And then I need to set the "list" pointer in ClassA.m to point to this array 
    ar = &array; //Is this how? 

    return resultFromSqlite; 
} 

正しいですか?あるいは私は何かを理解していないのですか?私はこのポインターツーポインターのものはまだ私とクリックしないと思います。ポインタについてのいくつかの一般的な情報源を読んだ後、私はこれをどうやってやっているのだろうと思っていますが、私の一部はなぜar引数が普通のポインタ(pointer-to-pointer) 。

答えて

6

ポインタへのポインタはビットescheric、はいです。簡単な方法は、Aで空の配列を作成し、それを埋めるだけのBへの通常の配列ポインタを渡すことです。あなたはBで配列を作成することを主張した場合、私はあなたがこれを行うことができると思います。このようなオブジェクトへのポインタを変更

- (void) createArray: (NSMutableArray**) newArray 
{ 
    NSAssert(newArray, @"I need a pointer, sweetheart."); 
    *newArray = [[NSMutableArray alloc] init]; 
    [*newArray addObject:...]; 
} 
+1

+1それはちょうどので、 '(!NEWARRAY = nilの)場合'をチェックするのが最善だろうけれどもあなたは間違ってヌルポインタを間接参照しません。 :) –

+0

右。私は、ポインターツーポインターの質問に答えるためにこの可能性について言及しましたが、実際には私が最初に言及したより単純なソリューションを使用していました。物事を明確にするための主張を追加します。 – zoul

+0

ありがとう、私はクラスAのオブジェクトを最初に作成し、そのクラスへのポインタをクラスBのメソッドに渡すことさえ考えませんでした。また、あなたの例で私はこれを理解していると思います。 newArray引数にポインタのアドレスを渡すと、ポインタへのポインタのコピーが実際に送信され、逆参照するとポインタ自体が得られます。次に、新しいアドレスを割り当てることができます。 – Adam

2

は、Objective-Cでかなり珍しいです。我々がこのようなものを見る主な時間は、メソッドが失敗の可能性があるときです。その時点で、NSError参照へのポインタを渡します。たとえば、NSFileManager- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)errorです。

これを行うにははるかに多くの一般的な方法は、この方法は、配列を返す持っているだろう:

NSMutableArray * list = [ClassB mutableArrayFromSQLite]; 
関連する問題