0

私はプロパティについて学んでいましたが、さまざまなドキュメントを読みましたが、プロパティがどのように機能するかについてまだ明確ではなく、混乱するシナリオに出くわしました.次のように 1 つのプロパティを作成する 1 つのサンプル アプリを作成しました。

@property(nonatomic,retain)NSString *strValue;

そしてそれを合成します:

@synthesize strValue;

1) 最初のシナリオ:

viewDidLoad で私は書いた:

strValue = [[NSString stringWithFormat:@"value"] retain];

dealloc で私は書いた:

NSLog(@"str value : %@",self.strValue);
[self.strValue release];

リークなしで正常に機能しました。私の質問は次のとおりです。保持されたプロパティ strValue(@property(nonatomic,retain)NSString *strValue;) を作成したときに保持されたメモリはどうなりましたか?

2) 2 番目のシナリオ:

viewDidLoad で私は書いた:

self.strValue = [[NSString stringWithFormat:@"value"] retain];

dealloc で私は書いた:

NSLog(@"str value : %@",self.strValue);
[self.strValue release];

self.strValue = [[NSString stringWithFormat:@"value"] preserve] 行でメモリ リークを示しました。質問は次のとおりです。ここでメモリ リークが表示されるのはなぜですか?この行は、次のコード行と同等ではありませんか?

[strValue release];
[strValue retain];

3) 3 番目のシナリオ: viewDidLoad に次のように記述しました。

self.strValue = [NSString stringWithFormat:@"value"];

dealloc で私は書いた:

NSLog(@"str value : %@",self.strValue);
[self.strValue release];

メモリ リークやダングリング リファレンスがなくても問題なく動作しました。プロパティが実際にどのように機能するかを誰か説明できますか?プロパティを使用するときにメモリがどのように割り当てられ、解放されるのですか?

4

1 に答える 1

1

最初の質問、

インスタンスをプロパティではなく変数自体に設定しているため、指定されたインスタンスを割り当てる (または保持する) 必要があります。この変数に自動解放されたオブジェクトを指定すると、後でプロパティがゾンビになります。

2 番目の質問

プロパティは既にインスタンスを保持しているため、類似していません。別の保持により、保持カウントがさらに 1 つ増加するため、解放されない追加の保持カウントが得られます。

3 番目の質問

前に述べたように、プロパティはインスタンスを保持するため、自動リリースされたインスタンスをそれに渡すことに問題はありません

これは保持プロパティセッターのサンプルです

- (void) setProperty:(BookItem *)prop
{
    if(_property != prop)
    {       
        [_property release];//release old
        _property = prop;
        [prop retain]; //retain new
    }
}
于 2012-06-25T09:51:35.843 に答える