メソッドを使用してポインターを変更するにはどうすればよいですか?
-
08-10-2019 - |
質問
Objective Cを使用してiPhoneアプリに取り組んでいます。クラスAがあります。これにより、「リスト」と呼ばれるNSMutablearrayポインターが作成されます。しかし、クラス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の引数が単なる定期的なポインターにならない理由を理解していません(ポインターとポインターとは対照的に) 。
解決
ポインターへのポインターは少し浮遊しています、はい。それを行う簡単な方法は、Aに空の配列を作成し、それを埋めるだけのBに通常の配列ポインターを渡すことです。 Bで配列の作成を主張した場合、これを行うことができると思います。
- (void) createArray: (NSMutableArray**) newArray
{
NSAssert(newArray, @"I need a pointer, sweetheart.");
*newArray = [[NSMutableArray alloc] init];
[*newArray addObject:...];
}
他のヒント
このようなオブジェクトにポインターを変更することは、Objective-Cではかなりまれです。このようなものが見られる主な時間は、メソッドが障害の可能性がある場合です。 NSError
参照。例えば、 NSFileManager
's - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error
.
これを行うためのはるかに一般的な方法は、メソッドに配列を返すことです。
NSMutableArray * list = [ClassB mutableArrayFromSQLite];