Хранить UIImageViews в NSMutableDictionary - PullRequest
0 голосов
/ 12 января 2012

У меня простой вопрос. Это мой заголовочный файл:

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

1 голос
/ 12 января 2012

Попробуйте сделать это:

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

Не создавайте и не вставляйте свои NSMutableDictionary и UIImageView через одну строку кода, потому что у вас есть утечки.

В первомВ случае, если вы делаете следующее, у вас есть счет на сохранение двух.У face1Layers есть политика сохранения.

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

Вы можете избежать такого разделения кода, как я объяснил ранее, или отправить сообщение autorelease инициализированному объекту.

Во втором случае, когда вы добавляете объект в NSDictionary или NSArray (и их подклассы), эти классы сохраняют добавленные объекты.

Надеюсь, это поможет.

0 голосов
/ 12 января 2012

Ну, я думаю, что здесь есть пара вещей:

  1. Вы никогда не выделяете словарь, как в NSMutableDictionary alloc init
  2. UIImageView выделен, но никогда не выпускается. Я бы выделил перед установкой его в качестве объекта, а затем добавить его, а затем выпустить его
...