0

UILabelクラスヘッダーファイルに次のように定義されています:

 `@property (nonatomic, retain) UILabel *label1;` 

そしてそれはこのようなインスタンス変数として存在します:

 `UILabel *label1;` 

.mファイルで合成されますが、viewDidLoad私が行う方法では次のようになります。

 `label1 = [UILabel alloc] init] autorelease];`

次に、フレームやテキストの色などを設定するなど、ラベルに対してさまざまなことを行います。ViewControllerの割り当てが解除されると、アプリがクラッシュし、コンソールにこのメッセージが表示されます。

 (Zombies enabled): `[CALayer release] message sent to deallocated instance` ...

私が:

autorelease1)単語を削除します..または

2)deallocメソッドでlabel1をリリースしない場合..または

3)[superdealloc]を削除します。ビューコントローラのdeallocメソッドから。

UILabelこのようなクラッシュに直面することなく、どうすればこれを適切にリリースできますか?

4

5 に答える 5

2

あなたは正しいことをしています。自動リリースとdeallocでのリリース。しかし、それはクラッシュするべきではありません。私がチェックするために同じことをしたからです。どこか別の場所でラベルをリリースする可能性があることを確認してください。そして再びdeallocでリリースします。

于 2012-07-24T11:31:14.937 に答える
1

ラベルを保持として宣言したため。割り当ては次のようになります

UILabel *myLabel = [[UILabel alloc] init];
// set all properties of label
self.label1 = myLabel;
[myLabel release];
myLabel = nil;

そして、deallocでlabel1をリリースします。

[label1 release];

これは私が慣れている方法であり、これは私にとって物事をよりスムーズにします。

于 2012-07-24T15:46:08.243 に答える
0

不思議なことに、self.label1 = [[[UILabel alloc] init] autorelease];を使用した場合、label1の代わりに=[[[UILabelalloc] init] autorelease]; 問題を解決しました。Deallocメソッドは、変更なしでそのまま残ります。本当に変です!!

于 2012-07-24T11:57:06.447 に答える
0

これを行うと、uはlabel1に自動リリースを使用しません。

 - (void)dealloc
{
  if(label1)
  {
    label1 = nil;
    [label1 release];
  }
  [super dealloc];
}
于 2012-07-24T10:56:15.827 に答える
0

ラベルは、deallocが呼び出される前にすでにリリースされています。これは、自動解放オブジェクトであるためです。あなたのdeallocはUIlabelすでにリリースされたものをリリースしようとしています、それはクラッシュします..あなたの質問で。1または2を使用できます。オブジェクトを1回割り当てた場合は、リリースを1回だけ呼び出します。retainディレクティブでプロパティに割り当てるためではなく@property、オブジェクトに1つの保持カウントが追加され、@property(retain)何も割り当てられませんが、プロパティをどのように処理するかをコンパイラに通知します

于 2012-07-24T11:21:14.063 に答える