我有一个char *
,我用strtok
处理它并获得strdup
获得的每一行的副本。
此char *
用作函数的参数,该函数将指针存储在NSMutableArray
中,其中包含NSPointerArray
的实例。
问题是当我在NSMutableDictionary
上调用释放消息时,我得到了问题
消息发送到deallocated instance`。
所以我觉得这里有些不对劲......
这里有一些代码:
proceedDataBlock = ^(const char *data){
NSDate *date = [NSDate date];
int counter = 0;
char *temp = strdup(data);
char *cline = strtok(temp, "\n");
Table *dataList = [[Table alloc] initWithType:m.Type groups:groupings];
while(cline)
{
// do something
[myObject addString:strdup(cline)];
cline = strtok(NULL, "\n");
}
free(temp);
[callbackObj performSelectorOnMainThread:@selector(recieveDataModelsFinished:)
withObject:[dataList autorelease] waitUntilDone:YES]; }
myObject:addString
看起来像:
-(void)addString:(char *)line
{
// models is an NSMutableArray
char cGroup = line[32];
NSString *group = [NSString stringWithFormat:@"%c", cGroup];
NSPointerArray *dataArray = [self.models objectForKey:group];
[dataArray addPointer:line];
}
现在,当我释放我的对象并调用dealloc:
-(void)dealloc
{
[_models release];
[_type release];
[super dealloc];
}
我得到了_models
字典中每个条目的消息
message send to deallocated instance
。
编辑: 在这里,我创建了模型字典及其内容:
self.models = [NSMutableDictionary dictionaryWithCapacity:100];
if (mappings.count > 0)
{
self.groupings = [mappings retain];
for (GroupingInfo *group in self.groupings)
{
NSPointerArray *dataArray = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsCStringPersonality];
[self.models setValue:dataArray forKey:group.key];
[dataArray release];
}
}
else
{
NSPointerArray *dataArray = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsCStringPersonality];
[self.models setValue:dataArray forKey:ALLITEMS_GROUP_KEY];
[dataArray release];
}
}
EDIT2: 当我在调试器中单步执行dealloc时,我只收到此消息,然后我看到了这些消息(但没有发生崩溃)如果我没有发生任何事情。
答案 0 :(得分:0)
我在Apple论坛中听到过这样的话:"如果只是在调试器中单步调试代码时才收到该消息,那么这是调试器的一个已知问题。当您单步执行代码以获取其描述时,调试器会向对象发送消息。如果一个对象被解除分配但仍在范围内,则调试器仍将向已释放的对象发送消息,从而导致控制台输出关于对已释放的实例进行消息传递。"所以我希望调试器出现问题。