2011-11-23 63 views
0

我正在完成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做了非常类似的事情,没有任何问题。我可能会错过什么?为什么这件事发布在我身上,或者即使发生了什么?

+1

lastBoutData是如何定义的?有价值的@属性?如果存在(保留等),该属性具有哪些设置?它可能丢失或不保留。 – ThomasW

+1

是lastBoutData一个(保留)属性吗? – NJones

+0

我将其从(readwrite,assign)改为(readwrite,retain),现在它可以工作。我使用的所有其他ivars都是(readwrite,assign),并且行为不同。我会读到这个,但我不清楚为什么我之前没有遇到这个问题?有关于此的任何想法? – Adam

回答

5
self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData]; 

dictionaryWithDictionary:返回自动释放字典。由于你的财产不(保留)没有保留它。因此,您之前的字典被取消引用并泄露,并且您的新字典不会保留。

考虑:

[lastBoutData release]; 
lastBoutData = [[NSDictionary alloc] initWithDictionary:self.inputBoutData]; 

或使用您的代码是,并添加保留的财产。

+0

谢谢你的帮助! – Adam