4

プロパティに割り当てたい変数を作成すると、次のことができます (プロパティが であると仮定します@property (nonatomic,retain) UILabel *myLabel;)。

UILabel *temp = [[UILabel alloc] init];
self.myLabel = temp;
[temp release];

が使用されていない次のシナリオでtempはどうなりますか?

self.myLabel = [[UILabel alloc] init];
[myLabel release];

[myLabel release];これは、プロパティのためにを追加すると仮定しdeallocています。

これは適切なメモリ管理でしょうか?2 番目の例ではmyLabel、行の後に 2 の保持カウントがありinitますか?

4

2 に答える 2

5

2 番目はたまたま機能する可能性がありますが、正しくありません。最初の行は を呼び出しますsetMyLabel:。それはivarを設定するために起こるかもしれませんが、そうでないかもしれません。あらゆる種類のことを行う可能性があります (コピーを作成する、情報を別の場所に保存するなど)。2 行目でivar. セッターがたまたま想定どおりに実装されている場合、幸運になり、機能します。しかし、これは正しいメモリ管理ではありません。

最初の例は正しいです。自動解放プールを使用して物事を簡素化することもできます。コードを ARC に移行することをお勧めします。これにより、これらすべての問題をより迅速かつ簡単に解決できます。

于 2012-05-21T16:02:35.713 に答える
-1

プロパティに割り当てると、割り当てられたオブジェクトretainが自動的に呼び出さretainれます (およびrelease前のオブジェクトが呼び出されます)。そうです、その後

self.myLabel = [[UILabel alloc] init];

[myLabel retainCount]initプロパティの割り当てから 1つと 2 つを返します。autoreleaseしたがって、上記の行に追加するかrelease、関数が終了する前に呼び出す必要があります。

于 2012-05-21T16:01:59.210 に答える