2012-01-12 7 views
0

私は簡単な質問があります。NSMutableDictionaryにUIImageViewsを保存

#import "FirstFaceController.h" 

@implementation FirstFaceController 

@synthesize face1Layers; 



-(void) dealloc { 
    [face1Layers release]; 
    [super dealloc]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.face1Layers = [NSMutableDictionary dictionary]; 
    [self.face1Layers setObject: 
      [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pic.png"]] 
       forKey:@"pic"]; 

    [self.view addSubview:[self.face1Layers objectForKey:@"pic"]]; 
    if ([[face1Layers objectForKey:@"pic"] superview] == nil) { 
     //.... 
    } 
} 

その後、私は "EXC_BAD_ACCESS" を持っている] [[face1Layers objectForKey:@"pic"]スーパーを呼び出す:私は私の辞書を初期化し、UIImageViewをどこに置くここで、

#import <UIKit/UIKit.h> 

@interface FirstFaceController : UIViewController 

@property (nonatomic,retain) NSMutableDictionary *face1Layers; 

@end 

この.M:これは私のヘッダファイルです。 なぜですか?

+0

これを試してください... self.face1Layers = [[NSMutableDictionary alloc] init]; –

+1

'self.view'をどうやって作りましたか? – vikingosegundo

+0

if文で何を確認しようとしているのかよくわかりません。 'self.view addSubview:[self.face1Layers objectForKey:@" pic "]];' then '[self.face1Layers objectForKey:@" pic "]'は 'self.view'がしなければ常にスーパービューを持ちます存在しない。 – FelixLam

答えて

1

試しを解放しますコードが漏れているためです。

最初のケースでは、次の場合、保持カウントは2になります。 face1Layersには保持ポリシーがあります。私は前に説明したように

self.face1Layers = [[NSMutableDictionary alloc] init]; 

あなたは、この分割にコードを避けることができるか、初期化されたオブジェクトにautoreleaseメッセージを送信します。

2番目のケースでは、NSDictionaryまたはNSArray(およびそれらのサブクラス)にオブジェクトを追加すると、これらのクラスは追加されたオブジェクトを保持します。

希望します。

+1

プロパティはmutableDictionaryを保持しているため、これもリークを生成します: 'self.face1Layers = [[NSMutableDictionary alloc] init] autorelease;; – FelixLam

+0

ありがとうございます。私はすでに修正済みです。 –

+1

このコードは、保持プロパティのために、 'face1Layers'をリークしています。保持カウントは2です。' self.face1Layers = [NSMutableDictionary dictionary]; '行はOKです。 – vikingosegundo

0

まあ、私は物事のカップルが間違ってここにあると思います。

  1. あなたは
  2. NSMutableDictionaryののallocのinitのように辞書を割り当てることはありませんUIImageViewは、割り当てられたが解放されることはありません。一行のthroughtあなたNSMutableDictionaryUIImageViewを作成し、挿入しないでください

    NSMutableDictionary* tempDict = [[NSMutableDictionary alloc] init]; 
    self.face1Layers = tempDict; 
    UIImageView* picView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pic.png"]]; 
    [self.face1Layers setObject:picView forKey:@"pic"]; 
    [picView release]; 
    [tempDict release]; 
    

    :私はそれをオブジェクトとして設定する前に割り当て、それを追加し、それをこれを行うには

+1

OPは、オートレリースされたディクショナリをそのプロパティを通じてただちに保持しています。 'self.face1Layers = [NSMutableDictionary dictionary];'という行はOKです。 – vikingosegundo

+0

本当に?自己を使ってalloc initをもう必要としません。私は知らなかった –

+0

[NSMutableDictionary辞書]は[[[NSMutableDictionary alloc] init] autorelease]の便利なメソッドです。プロパティにretain属性がある場合、オートレリースされたオブジェクトが返されます。プロパティはオブジェクトを保持します。 – FelixLam

関連する問題