我正在完成Quartz Composer自定义补丁的完成操作。截至目前,我已经几乎将所有东西都从补丁中删除了,并且崩溃告诉我,当我尝试NSLog NSDictionary值是一个伊娃时,它在最后一次执行时完美运行,并且在我分配它时运行良好。Objective-C中的NSDictionary的神秘发布?
我的代码如下所示:
- (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。
在执行的下一次运行中:atTime:withArguments:,self.inputBoutData仍然满,但lastBoutData再次为空!我看不出会发生什么。然后,它再次运行一个循环,就像最后一个循环一样,并成功将self.inputBoutData复制到lastBoutData,并再次记录。下一次,我在第二条NSLog语句之前得到了BAD ACCESS。
我收到了一些错误消息,告诉我lastBoutData不是NSDictionary,所以无奈之下,我添加了一个[lastBoutData retain],它不会崩溃。我没有发布这个伊娃,所以我不知道为什么我必须保留它。我在许多其他补丁中与其他ivars做了非常类似的事情,没有任何问题。我可能会错过什么?为什么这件事发布在我身上,或者即使发生了什么?
lastBoutData是如何定义的?有价值的@属性?如果存在(保留等),该属性具有哪些设置?它可能丢失或不保留。 – ThomasW
是lastBoutData一个(保留)属性吗? – NJones
我将其从(readwrite,assign)改为(readwrite,retain),现在它可以工作。我使用的所有其他ivars都是(readwrite,assign),并且行为不同。我会读到这个,但我不清楚为什么我之前没有遇到这个问题?有关于此的任何想法? – Adam