2

私がしたことは

int main(int argc, char *argv[]){
    NSString *str = [[NSString alloc] init];
    str = @"a a a a a a a a a ";
    [str release];
    NSLog(@"string is %@",str);
    return 0; 
}

印刷する前に解放するので、string は nil になると思います。しかし、そうではありません。したがって、私の消費は間違っています。

誰でも私にアドバイスして修正してもらえますか。どんなコメントでも大歓迎です。ありがとう

4

5 に答える 5

3

最初に新しい空のNSStringオブジェクトを割り当ててから、静的文字列リテラルをポインターに割り当て、以前に割り当てたメモリを効果的にリークします。次に、The Saad が指摘したように、所有していないオブジェクトを解放します。次に、解放はポインターを nil に設定するのではなく、割り当て解除で終了する場合と終了しない場合があるオブジェクトを解放するだけであることに注意してください (これは、 、オブジェクトの割り当てを解除すると仮定すると、ポインタも に戻されませんnil)。

于 2012-05-07T13:32:14.680 に答える
2

str変数は文字列オブジェクトへのポインタであり、基本的にメモリ アドレスが含まれています。オブジェクトにlike のメッセージを送信してretainも、変数の値は変更されません。

文字列が解放されたからといって、変数の値が失われることはありません。そのためには、変数を明示的に nil に設定する必要があります。

iOS 5 の ARC では、基になるオブジェクトが解放されると nil になる弱い参照/ポインターを取得できることに注意してください。これを行うには、変数宣言の前に__weakキーワード (またはweakプロパティ宣言で使用) を追加します。

于 2012-05-07T13:32:59.813 に答える
1

文字列定数は解放されません。それらは明示的に解放されることも自動解放されることもありません。それらは単なる定数です (ちなみに、それらはスコープの終わりで解放されます)。

したがって、以前に保持していた場合にのみ解放します

于 2012-05-07T13:29:36.897 に答える
0

修正したソースは次のとおりです。

何が起こっているのかを完全に理解する前に、学ぶべきことがたくさんあるのではないかと心配しています。また、malloc の理解 (ただし使用しないでください) と、C でのポインターの動作についても確認する必要があります。

int main(int argc, char *argv[]){
     NSString *str = [[NSString alloc] initWithString:@"a a a a a a a a a "];
     [str release];
     str = nil;
     NSLog(@"string is %@",str);
     return 0; 
}


int main(int argc, char *argv[]){
     NSString *str = @"a a a a a a a a a ";
     // DONT Call this - the str [str release]; - no need to release this kind of string
     NSLog(@"string is %@",str);
     return 0; 
}
于 2012-05-07T14:42:06.957 に答える