0

次のように、1 つのビューコントローラーで UIImage と UIImage ビューを宣言しました。

.h ファイル内:

UIImageView* itemImageView;
UIImage* itemImage;

@property (nonatomic, retain) UIImage* itemImage;
@property (nonatomic, retain) UIImageView* itemImageView;

.m ファイル内:

@synthesize itemImage, itemImageView;

別のビューでは、その値を設定します。

UIImage *image = [UIImage imageNamed:@"name1.png"];
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView.image = image;

[self.parentViewController.view addSubview:imgView.itemImageView];
[self dismissModalViewControllerAnimated:YES];  

このメソッド内では、itemImageView の保持カウントは 2 です。

しかし、プロパティと合成を配置したビューに戻ると、保持カウントが 0 で、オブジェクトにアクセスできません。

何が起こっているのですか?

4

3 に答える 3

0

ここのコードは問題ないようです。(メモリリークは別として)retain-count +1のImageViewをitemImageViewに割り当てているため、2に増えます。itemImageView に設定した後、ImageView で release を呼び出す必要があります。

UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView = iv;
[iv release];

ただし、これで問題が解決するわけではありません (さらに悪化します..) もっとコードを表示できますか? デバッガでステップスルーしてみましたか?

于 2010-12-08T20:49:47.477 に答える
0

あなたの問題はこの行にあります:

[self.parentViewController.view addSubview:imgView.itemImageView];

これはおそらく次のように編集する必要があります。

[self.parentViewController.view addSubview:self.parentViewController.itemImageView];

これは、imgView が本当にparentViewController.view と同等かどうかという疑問につながります。そうしたい場合は、それがどこに割り当てられたかを把握し、どこでそれを台無しにしたかを確認する必要があります。そうでない場合は、オブジェクトを割り当てる前にオブジェクトを構築するための一時的なコンテナー以外に使用しても意味がありません。

編集:メモリリークは別の問題ですはい、しかし、メソッドで imgView を宣言した方法がわからないので、解決するために残しました:)

于 2010-12-08T20:50:21.183 に答える
0
UIImageView* itemImageView;
...
@property (nonatomic, retain) UIImageView* itemImageView;
...
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];

これによりalloc、保持カウンタが 1 増加し、 のretain設定も 1 増加するため、二重保持が発生し@propertyます。

プロパティを設定するための一般的なパターンは次のようになります。

.h:

SomeClass* someClass;
...
@property (nonatomic, retain) SomeClass* someClass;

.m:

SomeClass* temporarySomeClass = [[SomeClass alloc] init];
self.someClass = temporarySomeClass;
[temporarySomeClass release];
...

ここでは、一時変数を使用して割り当てたオブジェクトを保持し、その後すぐに解放しています。

Apple のサンプル コードを見れば明らかです。

于 2010-12-08T20:50:40.417 に答える