将UIImageViews存储在NSMutableDictionary中

时间:2012-01-12 13:13:01

标签: iphone objective-c ios uiimageview nsmutabledictionary

我有一个简单的问题。这是我的头文件:

#import <UIKit/UIKit.h>

@interface FirstFaceController : UIViewController

@property (nonatomic,retain) NSMutableDictionary *face1Layers;

@end

这个.m,这里我初始化我的字典并放在UIImageView:

#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 ) {
         //....
    }
}

然后我打电话给[[face1Layers objectForKey:@"pic"] superview]我有“EXC_BAD_ACCESS”。 为什么呢?

2 个答案:

答案 0 :(得分:1)

尝试这样做:

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];

请勿在一行代码中创建和插入您的NSMutableDictionaryUIImageView,因为您有泄漏。

在第一种情况下,如果您执行以下操作,则保留计数为2。 face1Layers有保留政策。

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

您可以避免像我之前解释的那样拆分代码或向初始化对象发送autorelease消息。

在第二种情况下,当您在NSDictionaryNSArray(及其子类)中添加对象时,这些类会保留添加的对象。

希望它有所帮助。

答案 1 :(得分:0)

嗯,我认为这里有一些问题:

  1. 您永远不会像NSMutableDictionary alloc init
  2. 那样分配字典
  3. UIImageView已分配但从未发布。我会在将其设置为对象之前进行分配,然后添加它,然后将其释放