Ada*_*dam 0 memory-management objective-c nsdictionary retain ivar
我正在为Quartz Composer定制补丁的最后润色.截至目前,我几乎所有内容都被删除了补丁,当我尝试NSLog NSDictionary值为ivar时,它崩溃告诉我BAD ACCESS,并且当我分配它时,它在上次执行时完美运行.
我的代码看起来像这样:
- (BOOL) startExecution:(id<QCPlugInContext>)context
{
lastBoutData = [[NSDictionary alloc] init ];
return YES;
}
- (BOOL) execute:(id<QCPlugInContext>)context atTime:(NSTimeInterval)time withArguments:(NSDictionary*)arguments
{
NSLog(@"self.inputBoutData: %@", self.inputBoutData);
NSLog(@"lastBoutData: %@", lastBoutData);
// have new data, put it on the output
self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];
NSLog(@"assigned: %@", lastBoutData);
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我可以看到日志显示所有三个NSLog行完美地工作,直到self.inputBoutData输入.然后,我看到self.inputBoutData被成功复制到循环的最后一个NSLog行中的lastBoutData.
在下一次执行run:atTime:withArguments:中,self.inputBoutData仍然是满的,但lastBoutData再次为空!我不明白这是怎么回事.然后,它运行一个循环,就像最后一个循环一样,并成功将self.inputBoutData复制到lastBoutData,然后再次记录它.下一次,我在第二次NSLog语句之前得到了BAD ACCESS.
我收到一些错误消息,告诉我lastBoutData不是NSDictionary,所以出于绝望,我添加了[lastBoutData retain],并且它没有崩溃.我没有发布这种伊娃,所以我不确定为什么要保留它.在许多其他补丁中我和其他ivars做的事情非常相似,没有任何问题.我能错过什么?为什么这件事在我身上释放,或者甚至发生了什么?
self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];
Run Code Online (Sandbox Code Playgroud)
dictionaryWithDictionary:返回一个自动释放的字典.而且由于你的财产不是(保留)没有任何保留它.因此,您之前的字典将被取消引用并泄露,并且不会保留您的新字典.
考虑:
[lastBoutData release];
lastBoutData = [[NSDictionary alloc] initWithDictionary:self.inputBoutData];
Run Code Online (Sandbox Code Playgroud)
或者按原样使用您的代码并为该属性添加retain.