引き続き画像の蓄積によるメモリリークを潰してます。今度は UIButton 。アプリ作成時に iOS6 と iOS7 の両対応をしている場合、 setBackgroundImage:forState: メソッドに画像を設定しておかないと、もれなく両バージョンで表示のされ方が違うというおまけがついてきます。
前回のCALayer から UIImage を解放する記事で、強参照かどうかを見極めるのに プロパティの宣言を確認しようと書きましたが、メソッドの場合は内部処理が書かれているわけではないので、見落としてしまうことがあるかもしれません。
一番大切なことは、UIImage をどこに設定したかきちんと把握しておくということだと改めて痛感しています。
それでは、UIButton から UIImageを解放する方法です。いつものように nil をセットし removeFromSuperview をするだけです。しかし、今までのように プロパティ に頼ることはできません。なぜなら、backgroundImage というプロパティがないからです。ちなみに、 image プロパティ もありません。
ということで、少々強引に感じる方もおられるかもしれませんが、setBackgroundImage:forState: メソッドを介して nil を叩き込みましょう。
1 2 3 4 5 6 7 8 9 10 |
{ /* 登録 */ UIButtton* infoButton = [UIButton alloc] initWithFrame:CGRectMake(0,0,100,40)]; [infoButton setBackgroundImage:[SAUtility pathForResource:@"info.png"] forState:UIControlStateNormal]; [self.view addSubview:infoButton]; /* 解放 */ [infoButton setBackgroundImage:nil forState:UIControlStateNormal]; [infoButton removeFromSuperview]; // 重要:Viewを解放しないと画像は解放されません。 } |
SAUtility pathForResource:に関しては、UIImageViewからUIImageを解放するをご確認ください。
UIControlStateHighlighted UIControlStateDisabled に関しても同様です。
また、setImage:forState: に関してもメソッドからnilを叩きこむことで画像をメモリから解放できます。
いつもそうですが、nilするだけでなく、親のビューから解放してやらないと画像が解放されませんので気をつけましょう。
おわり。
コメント