我有一个简单的问题。这是我的头文件:
#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”。
为什么呢?
答案 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];
请勿在一行代码中创建和插入您的NSMutableDictionary
和UIImageView
,因为您有泄漏。
在第一种情况下,如果您执行以下操作,则保留计数为2。 face1Layers有保留政策。
self.face1Layers = [[NSMutableDictionary alloc] init];
您可以避免像我之前解释的那样拆分代码或向初始化对象发送autorelease
消息。
在第二种情况下,当您在NSDictionary
或NSArray
(及其子类)中添加对象时,这些类会保留添加的对象。
希望它有所帮助。
答案 1 :(得分:0)
嗯,我认为这里有一些问题: