0

我正在为 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 做非常相似的事情,没有任何问题。我会错过什么?为什么这件事会在我身上释放,或者这就是正在发生的事情?

4

1 回答 1

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

dictionaryWithDictionary:返回一个自动发布的字典。而且由于您的财产没有(保留),因此没有任何保留。所以你以前的字典被取消引用和泄露,你的新字典不会被保留。

考虑:

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

或者按原样使用您的代码并将保留添加到属性中。

于 2011-11-23T03:39:45.937 回答