在Objective-C中神秘发布NSDictionary?

在Objective-C中神秘发布NSDictionary?,objective-c,memory-management,nsdictionary,retain,ivar,Objective C,Memory Management,Nsdictionary,Retain,Ivar,我正在为Quartz Composer定制补丁的收尾工作。到目前为止,我已经从修补程序中剥离了几乎所有内容,当我尝试NSLog一个NSDictionary值(它是一个ivar)时,它崩溃了,告诉我访问不好,这在我分配它的最后一次执行中非常有效 我的代码如下所示: - (BOOL) startExecution:(id<QCPlugInContext>)context { lastBoutData = [[NSDictionary alloc] init ]; retur

我正在为Quartz Composer定制补丁的收尾工作。到目前为止,我已经从修补程序中剥离了几乎所有内容,当我尝试NSLog一个NSDictionary值(它是一个ivar)时,它崩溃了,告诉我访问不好,这在我分配它的最后一次执行中非常有效

我的代码如下所示:

- (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;
}
-(BOOL)startExecution:(id)上下文
{
lastBoutData=[[NSDictionary alloc]init];
返回YES;
}
-(BOOL)execute:(id)context-atTime:(NSTimeInterval)time with-arguments:(NSDictionary*)arguments
{
NSLog(@“self.inputBoutData:%@”,self.inputBoutData);
NSLog(@“lastBoutData:%@”,lastBoutData);
//有新的数据,把它放在输出上
self.lastBoutData=[NSDictionary Dictionary WithDictionary:self.inputBoutData];
NSLog(@“已分配:%@”,lastBoutData);
返回YES;
}
我可以看到日志显示,在self.inputBoutData有输入之前,所有三条NSLog行都能正常工作。然后,我看到self.inputBoutData在循环的最后一行NSLog中成功复制到lastBoutData

在下一次运行execute:atTime:withArguments:时,self.inputBoutData仍然已满,但lastBoutData再次为空!!!我真不明白怎么会发生这种事。然后,它像上一个一样再运行一个循环,并成功地将self.inputBoutData复制到lastBoutData,然后再次记录。下一次,在第二条NSLog语句之前,我得到了错误的访问

我收到一些错误消息,告诉我lastBoutData不是NSDictionary,所以出于绝望,我添加了一个[lastBoutData retain],它没有崩溃。我不会发布这个ivar,所以我不知道为什么我必须保留它。我在许多其他补丁中对其他IVAR做了非常类似的事情,没有任何问题。我会错过什么?为什么这件事会在我身上发生,或者这就是正在发生的事情

self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];
dictionaryWithDictionary:
返回自动删除的词典。因为你的财产没有(保留)任何东西都没有保留它。因此,您以前的词典被取消引用并泄露,而您的新词典也不会保留

考虑:

[lastBoutData release];
lastBoutData = [[NSDictionary alloc] initWithDictionary:self.inputBoutData];
或者按原样使用代码并将retain添加到属性中

dictionaryWithDictionary:
返回自动删除的词典。因为你的财产没有(保留)任何东西都没有保留它。因此,您以前的词典被取消引用并泄露,而您的新词典也不会保留

考虑:

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

或者按原样使用代码并将retain添加到属性。

lastBoutData是如何定义的?该值是否有@属性?如果属性存在(保留等),它有哪些设置?它可能丢失或不是保留。lastBoutData是(保留)属性吗?我将它从(读写,分配)更改为(读写,保留),现在可以使用了。我使用的所有其他IVAR都是类似的(读写、赋值),它们的行为方式不一样。我会读到这个,但我不清楚为什么我以前没有遇到过这个问题?有什么想法吗?lastBoutData是如何定义的?该值是否有@属性?如果属性存在(保留等),它有哪些设置?它可能丢失或不是保留。lastBoutData是(保留)属性吗?我将它从(读写,分配)更改为(读写,保留),现在可以使用了。我使用的所有其他IVAR都是类似的(读写、赋值),它们的行为方式不一样。我会读到这个,但我不清楚为什么我以前没有遇到过这个问题?有什么想法吗?