0

私はObjectiveCで変数を初期化することについてのいくつかの説明を探しています。

配列を返すメソッドがあるとします。

-(NSMutableArray *) getArray
{
    NSMutableArray *arr = [[NSMutableArray alloc]init];  //line A

for(int i = 0; i < 10; i++)
{
    [arr addObject:@"word"];
}

return arr;
}

そして、このメソッドを呼び出します。

NSMutableArray *myArray = [[NSMutableArray alloc]init];  //line B
                myArray = [self getArray];

では、メモリをA行とB行の両方に割り当てる必要がありますか、どちらにも割り当てないでください。または、AだけまたはBだけに割り当てる必要がありますか。代替案は単純です

NSMutableArray *arr;      //replacing line A
NSMutableArray *myArray;  //replacing line B
4

2 に答える 2

1

1つのアレイについては、そのメモリを割り当てて、一度初期化する必要があります。

そもそも、それは最後の選択肢が機能しないことを意味します。これらの2つの変数が存在し、配列を指すことを宣言していますが、それらを作成して割り当てることは何もしません。

getArray行Bは配列を作成して初期化しますが、結果を同じ変数に割り当てることにより、配列への唯一の参照をすぐに失います。ARCメモリ管理を使用する場合、それは少し無駄です。ARCがないと、メモリリークになります。

行Aはまた、配列を正しく作成して初期化します。投稿したコードに関する限り、それは次に行うことの影響を受けるコードですmyArray

(変数として宣言するもの(のように)は、オブジェクト自体ではなく、実際のオブジェクトの名前NSMutableArray *arrと考えることができることを忘れないでください。)

于 2012-10-15T18:14:41.810 に答える
1

Aにメモリを割り当てる必要がありますが、Bに割り当てます。Aのalloc / initは、変数arrが参照しているオブジェクトを作成ます。そのオブジェクトをメソッドgetArrayの戻り値として渡します。

Bでは、myArrayが返されたオブジェクトを参照するようにしたいだけで、新しいオブジェクトは必要ありません。もし、するなら:

NSMutableArray *myArray = [[NSMutableArray alloc]init];  //line B
                myArray = [self getArray];

最初の行は新しいオブジェクトを作成し、それをmyArrayに割り当てます。2行目は、myArrayのその値を、メソッドから返される別のオブジェクトにすぐに置き換えます。ARC(自動参照カウント)がないと、最初の行で作成されたオブジェクトのメモリリークが発生します。

于 2012-10-15T18:16:33.883 に答える