3

私はスクロールビューを持っています。このスクロールビューにボタンを追加してから離します。

UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];
saveButton.frame = CGRectMake(415.0, 473, 80, 38);
saveButton.titleLabel.font = [UIFont fontWithName:@"Heiti TC" size:24];
[saveButton setTitle:@"" forState:UIControlStateNormal];
[saveButton setContentEdgeInsets:UIEdgeInsetsMake(2, 0, 0, 0)];
saveButton.backgroundColor = [UIColor clearColor];
[saveButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal ];
[saveButton setBackgroundImage:[UIImage imageNamed:@"save.png"] forState:UIControlStateNormal];
[saveButton addTarget:self action:@selector(save) forControlEvents:UIControlEventTouchUpInside];
saveButton.hidden = NO;
[self.scrollview addSubview:saveButton];
[saveButton release];

ビューが画面に表示されるとアプリケーションがクラッシュし、画面の任意の部分に触れようとします。

コメントアウトしたら

[saveButton release];

アプリケーションは完全に機能します。

ボタンをスクロールビューに追加すると、ボタンの保持カウントがインクリメントされるので、ボタンを離しても安全だと思いました。

何が起きてる?スクロールビューに何かを追加することは、以下のようにメインビューに追加することと同じではありませんか?

[self.view addSubview:saveButton];
4

5 に答える 5

10

buttonWithType:は便利なコンストラクターであるため、自動解放されたインスタンスが既に作成されており、オブジェクトを解放する必要はありません。

つまり、次のコード行はエラーです。

[saveButton release];

releaseインスタンスはすでに自動解放されているため、 を送信しないでください。

詳細はUIButtonリファレンスを確認してください。

于 2012-05-21T10:52:11.137 に答える
3

ここではalloc/init/new使用されていないため、自動リリースされます。このようなものがある場合は、次のようなUIButton *savebutton = [[UIButton alloc]init];リリースを使用する必要があります。[saveButton release];

于 2012-05-21T10:59:50.210 に答える
3
UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];

これは、メモリ管理規則に従って、このコードは自動解放されたオブジェクトを返し、ジョブを終了したときにそれを解放する必要はありません。ビューのサブビューとして追加すると、追加先のビューはそれを保持し、そのメモリ管理については責任を負いません。

于 2012-05-21T10:54:06.740 に答える
1

ここでの問題は、

[UIButton buttonWithType:UIButtonTypeCustom]

メソッドは、自動解放プールによってのみ保持される自動解放されたオブジェクトを返します (現在のイベント キューの最後でオブジェクトを解放します)。つまり、所有権がないことを意味します (保持されません)。それをスクロール ビューに追加すると、保持カウントが 1 つ増えますが、リリース メッセージを送信して次の行ですぐに破棄します。

これを行う正しい方法は、リリース呼び出しを削除することです (メモリ管理については完全に明確になります)。

iOS メモリ管理の詳細については、こちらを参照してください。

于 2012-05-21T10:54:49.103 に答える
0

ボタン オブジェクトにメモリを割り当てていません。どうすればそれを解放できますか。

UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];

それ自体がメモリ管理を処理する静的メソッドを呼び出しました。それがアプリのクラッシュの唯一の原因です。

于 2012-05-21T10:58:34.003 に答える