iphone:发送到解除分配的实例的消息

时间:2012-04-02 08:22:20

标签: iphone ios memory-management memory-leaks

我知道那种菜鸟问题,但它现在已经让我感到伤心了2天 我有以下代码

albumsVC.discList = [[NSMutableArray alloc]init];
for(id song in songs){
    if([self checkIfAllFilesExist:[song objectForKey:@"fileName"]]){ 
        [albumsVC.discList addObject:song];
    }
}

 -(BOOL)checkIfAllFilesExist: (NSString *) theFilename {
    BOOL exist;
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [documentPaths objectAtIndex:0];
    docPath = [ documentDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp3",theFilename]];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    exist = [fileManager fileExistsAtPath:docPath];
    docPath = nil;
    docPath = [[NSString alloc] init];
    if(!exist){
        return NO;
    }
    return YES;
}

但它在五个循环后崩溃(我不知道为什么五个?)它告诉我发送到解除分配的实例0x87cdc10的消息 在

docPath = [ documentDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp3",theFilename]];

其中docPath是创建为非原子的头文件中的NSString并保留..

我无法解决问题你能帮助我吗?

2 个答案:

答案 0 :(得分:0)

-(BOOL)checkIfAllFilesExist: (NSString *) theFilename会造成内存泄漏。

将其替换为以下代码:

-(BOOL)checkIfAllFilesExist: (NSString *) theFilename {
    BOOL exist;
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [documentPaths objectAtIndex:0];
    self.docPath = [ documentDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp3",theFilename]];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    exist = [fileManager fileExistsAtPath:docPath];
    if(!exist){
        return NO;
    }
    return YES;
}

假设您的.h文件中包含非原子的docPath属性,请保留。

答案 1 :(得分:0)

因为你说它总是在循环的第五次迭代中崩溃,所以检查循环所带来的对象。

我的意思是说,检查theFilename。尝试打印'song'字典以确保您在fileName密钥中有内容。

也使用Apurv代码。