2

Objective-C とオブジェクトの割り当て/解放について少し混乱しています。

私がこれを行う場合:

NSString *myString;

if([someString isEqualToString: @"test1"]){
    myString = @"got 1";
}else{
    myString = @"got 2";
}

myStringその後、リリースしなければなりませんか?

自己定義オブジェクトについても同様です:

myOwnObject *someObject = [someArray objectAtIndex: 1];

myButton.label1.text = someObject.name;

リリースする必要がありsomeObjectますか?

私が質問している理由は、メソッドでメモリ リークが発生し、それがどこにあるのかがわからないためです。そのため、割り当て/解放を正しく行うかどうかを把握しようとしています。リークは NSPlaceholderString で発生します (NIB ファイルのどこかに隠されていると思います)。

また、オブジェクトがある場合、それを割り当てますが、一部のプロパティのみを使用しますが、dealloc ですべてのプロパティを解放すると、メモリ リークが発生しますか?

申し訳ありません-私の質問が少なくともある程度の意味をなすことを願っています:)

助けてくれてありがとう!

4

3 に答える 3

1

私の話を聞いて下さい。これが重要な唯一のルールです。


名前に「copy」、「alloc」、「new」、または「retain」が含まれるメソッドを使用する場合

あなたはオブジェクトを所有しており、後でそれをリリースまたは自動リリースする必要あります。

そうでない場合:

しないでください!

ただし、オブジェクトを所有していないため、オブジェクトがそのスコープの外側に留まるとは思わないでください。

とても簡単です。


MyClass *foo = [[MyClass alloc] init];
[array addObject:foo];
[foo release];

「コピー」、「保持」、「新規」、または「割り当て」を使用しましたか?はい。それを解放しなさい。

MyClass *someObject = [someArray objectAtIndex:0];

「コピー」、「保持」、「新規」、または「割り当て」を使用しましたか?いいえ、リリースしないでください。

しかし

他のメソッドでアクセスする必要があるインスタンス変数がある場合:

ivar = [[someArray objectAtIndex:0] retain];

そうすれば、あなたはそれを所有しているので、それが固執することが保証されます。

(これを処理する別の方法は、@property (retain)プロパティを使用することです。そうすれば、実行でき、self.ivar = someObject保持されます。)

しかし、それらをリリースすることを忘れないで-deallocください!

于 2010-07-24T18:09:22.173 に答える
0

最初の質問に答えるために、@""構文で作成された文字列を解放する必要はありません。

2番目の例では、を解放する必要はありませんsomeObjectdeallocただし、クラスのメソッドがmyOwnObjectすべてのインスタンス変数を正しく解放しない場合、問題が発生する可能性があります。

于 2010-07-24T18:01:52.053 に答える
0

いいえ、どちらも解放する必要はありません。私は通常、次のスニペットのように、release私がするオブジェクトのみを使用します。alloc

NSString *string = [[NSString alloc] initWithFormat:@"%@", something];
// yadda yadda yadda some code...
[string release];
于 2010-07-24T17:41:42.377 に答える