7

実際、私はARC有効にしたプロジェクトに取り組んでいます。私はオブジェクトの使用を知ってallocおり、オブジェクトinitを取得ownershipしています。私が知っている、私がこのような文字列を作成する場合

NSString *myString = [[NSString alloc]initWithFormat:@"Something"];

それから私は自分自身にする必要がありreleaseますmyStringARC対応を使用している場合はどうなりますか?自分で解放することはできません。それで、それはリークを作成しますか?または、このようなオブジェクトを作成するべきではありませんか?

以下のコードのような文字列も作成できます。

NSString *myString = [NSString stringWithFormat:@"Something"];

しかし、ARC対応プロジェクトに正確に使用する必要があるタイプはどれですか?最初のタイプを使用するとどうなりますか?

4

3 に答える 3

16

ARCを使用しているrelease場合は、コンパイル時に必要なすべての呼び出しが追加されます。漏れません。

の違い

NSString *myString = [[NSString alloc]initWithFormat:@"Something"];

NSString *myString = [NSString stringWithFormat:@"Something"];

つまり、最初のmyStringインスタンスはそのブロック内の最後の参照の後に自動的に解放され、2番目のインスタンスは自動解放されたインスタンスであり、実行ループの最後にのみ解放されます。大きな違いはありませんが、多くのオブジェクトを使用している場合は、メモリ使用量を低く抑えるために、自動解放されたオブジェクトを避けるようにしてください。

于 2012-11-21T14:35:19.527 に答える
1

ARCがメモリ管理を処理するので、変数の呼び出しについて心配する必要はありません。ARCがそれを行いますreleasemyStringまた、提案として、次のようなオブジェクトを作成するために便利なメソッドを使用することをお勧めします。

[NSString stringWithFormat:@"Something"];

于 2012-11-21T14:34:50.090 に答える
0

文字列ポインタをnilに設定して解放するだけで十分です。
ARCなしで実行できるのと同じことを実行することもできますが、明示的に何も実行しない場合、ARCが(ほぼ)すべてを管理するという利点があります。

したがって、リリースするにはnilに設定し、他に何ができるか見てみましょう。

    NSString* str= [[NSString alloc]initWithUTF8String: "Hello"];
    // here the retain count of str is 1
    __unsafe_unretained NSString* string= str;
    // again 1 because string is __unsafe_unretained
    void* data= (__bridge_retained void*) string;
    // data retains the string, so the retain count is to 2
    // This is useful in the case that you have to pass an objective-c object
    // through a void pointer.You could also say NSString* data= string;
    str=nil;
    // Here the retain count of str is 1
    NSLog(@"%@",(__bridge NSString*)data);

アップデート

オブジェクトが解放されたことに気付かないことがある理由は次のとおりです。

    NSString* str= [[NSString alloc]initWithString: @"hey"];
    __unsafe_unretained NSString* str2=str;
    str=nil;
    NSLog(@"%@",str2);

この場合、str = [[NSString alloc] initWithString:@"hey"]はstr= @ "hey"と同じですが、strは自動解放され、解放されないという違いがあります。ただし、コンパイラはstr =@"helloのコードを最適化します。 "したがって、自動リリースブロック内にいる場合は問題はなく、str2は正しく出力されます。
そのため、コンパイラの最適化を回避するために、initWithUTF8Stringを使用しました。

于 2012-11-21T15:09:13.083 に答える