2

私は目的の C を使用して iPhone アプリに取り組んでいます。「リスト」と呼ばれる NSMutableArray ポインターを作成するクラス A があります。しかし、クラス A では、それが指すオブジェクトを作成することはありません。代わりに、クラス B のクラス メソッドを呼び出して、sqlite データベースからデータを取得し、そこに NSMutableArray オブジェクトを設定します。メソッドに引数として渡すことにより、クラス A のポインターを、クラス B メソッドで作成された NSMutableArray オブジェクトを指すように設定できるようにしたいと考えています。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引数が(ポインターからポインターではなく)通常のポインターになれない理由を理解していません。 .

4

2 に答える 2

6

はい、ポインターへのポインターは少し風変わりです。これを行う簡単な方法は、A に空の配列を作成し、通常の配列ポインターを B に渡すことです。Bで配列を作成することを主張した場合、これを行うことができると思います:

- (void) createArray: (NSMutableArray**) newArray
{
    NSAssert(newArray, @"I need a pointer, sweetheart.");
    *newArray = [[NSMutableArray alloc] init];
    [*newArray addObject:...];
}
于 2011-01-08T19:54:22.443 に答える
2

このようにオブジェクトへのポインターを変更することは、Objective-C ではかなり珍しいことです。このようなものが主に見られるのは、メソッドが失敗する可能性があるときです。その時点で、NSError参照へのポインターを渡します。たとえば、NSFileManager- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

これを行うためのはるかに一般的な方法は、メソッドに配列を返すようにすることです。

NSMutableArray * list = [ClassB mutableArrayFromSQLite];
于 2011-01-08T20:07:16.583 に答える