我正在为 Quartz Composer 进行自定义补丁的最后润色。截至目前,我几乎已经从补丁中删除了所有内容,当我尝试 NSLog 一个 ivar 的 NSDictionary 值时,它告诉我 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;
}
我可以看到日志显示所有三个 NSLog 行都可以正常工作,直到 self.inputBoutData 输入。然后,我看到 self.inputBoutData 已成功复制到循环的最后 NSLog 行中的 lastBoutData 。
在下一次执行 execute:atTime:withArguments: 时,self.inputBoutData 仍然是满的,但 lastBoutData 又是空白!!!我看不出这怎么会发生。然后,它像上一个一样再运行一个循环,并成功地将 self.inputBoutData 复制到 lastBoutData,并再次记录。下一次,我在第二个 NSLog 语句之前得到了 BAD ACCESS。
我收到一些错误消息,告诉我 lastBoutData 不是 NSDictionary,所以出于绝望,我添加了一个 [lastBoutData 保留],它不会崩溃。我没有发布这个 ivar,所以我不确定我为什么要保留它。我在许多其他补丁中与其他 ivars 做非常相似的事情,没有任何问题。我会错过什么?为什么这件事会在我身上释放,或者这就是正在发生的事情?