1

ユーザーが選択した画像を保持するために使用されている(保持された)UIImageプロパティがあります。

これは、ユーザーが選択したときに現在持っているコードです。

- (IBAction) selectImage1 {
    UIImage *image = [UIImage imageNamed: @"image1-big.png"];
    self.bigImage = image;
} 

しかし、一時変数の便利なメソッドの使用を省略して、これを実行することは可能かどうか疑問に思っています。

- (IBAction) selectImage1 {
    self.bigImage = [UIImage imageNamed: @"image1-big.png"];
} 

この2番目の方法に問題がある場合(メモリ管理に関係があると思います)、誰か説明してもらえますか?

ありがとうございました!

4

2 に答える 2

1

投稿した2つのスニペットの間で、メモリ管理の点で違いはありません。最初のスニペットの2行の間の保持カウントについて本当に具体的にならない限り。

ARC環境では、ローカル変数は「強力な」ポインタになりますが、メソッドがスコープを離れると解放されます。2番目のスニペットには、中間の保持/解放ポインターがないため、実際にはわずかに効率的である可能性があります。

最初のスニペットのテクニックが必要であると私が見た場所は、弱いポインター(つまり弱い@property)があり、設定self.foo = [UIView ...によってすぐに解放できる場合です。このような場合は、ローカル変数を使用して、作業中はローカル変数を保持することをお勧めします。

UIView *someFoo = [UIView...
[self addSubview:someFoo];
self.someWeakProperty = someFoo;

と比べて:

self.someWeakProperty = [UIView...
[self addSubview:self.someWeakProperty]; // it's already nil!!
于 2012-07-31T22:06:57.973 に答える
1

2番目の方法は完全に問題ありません。この行は、自動解放さUIImage *image = [UIImage imageNamed: @"image1-big.png"];れる変数を提供します。値を保持する呼び出しのsetterメソッドをimage介してivarに割り当てます。したがって、この行はより冗長な方法と同等です。self.bigImage = imagebigImageself.bigImage = [UIImage imageNamed: @"image1-big.png"];

于 2012-07-31T22:02:15.520 に答える