iphone:涉及NSString的内存泄漏

时间:2012-02-17 10:13:44

标签: iphone objective-c ios cocoa-touch memory-leaks

如果用户对其照片库进行了更改,我在此处有一段代码可以更新ALAssetGroup(相册):

- (void) ALAssetsLibraryChangedNotification
{
    [[self activityIndicator] startAnimating]; 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [[self library] enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
    {
        if (group != nil)
        {
            NSString *newAlbumID = [[NSString alloc] initWithString: [group valueForProperty: ALAssetsGroupPropertyPersistentID]]; 

            if ([newAlbumID isEqualToString: self.albumID])
            {
                self.album = group;
                [self loadPhotos];
                [newAlbumID release];
                return;
            }

            [newAlbumID release];
        }

    }
    failureBlock:^(NSError *error) 
    {
    }];

    [pool release];

}

它有效,但只有这么长时间才能获得“signalbrt”并且相应的“-[UIButtonContent isEqualToString:]: unrecognized selector sent to instance”与之相符(有时候UIButtonContent将会NSArray代替)。我还启用了僵尸并获得了诸如“*** -[CFString release]: message sent to deallocated instance" and "*** -[CFString class]: message sent to deallocated instance”之类的消息。我试过以一堆不同的方式分配字符串,没有一个正常工作。有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:0)

尝试

        NSString *newAlbumID = [[NSString alloc] initWithString: [group valueForProperty: ALAssetsGroupPropertyPersistentID] autorelease]; 

并删除此对象的其他版本。

答案 1 :(得分:0)

我的第一个猜测是怀疑self.albumIDself.album被声明为assign而不是retaincopy,或者说有什么问题loadPhotos。检查这些属性的声明并暂时删除loadPhotos调用。它还会崩溃吗?

您分配的字符串的两个版本是Kosher,但代码的组织方式使得很难推理。你应该重构它,以便字符串自动释放或释放一次。

答案 2 :(得分:0)

我认为问题很可能与'group'变量和/或对该组变量的'valueForProperty'调用有关。这可能是在某个地方发布的。因此,当您从性质上的“组”变量初始化你的“newAlbumId”你得到分配的指针,随机存储器(自组对象或已发布),这是结束了是一个指针“UIButtonContent”或者有时和'NSArray'。因此,执行'isEqualToString'会获得抛出的错误。与此类似,这就是为什么你会在启用僵尸的情况下收到警告。

如果启用了NSZombies,您是否收到与访问组变量有关的任何警告?

此外,如何管理组变量内存所引用的对象 - 您是分配/初始化并将其直接分配给包含对象中的iVar(而不是通过属性访问器作为属性)?如果是的话请确保你没有“释放”它这页头后,因为既然它是不是没有得到保留在伊娃分配的财产 - 你只需要刚刚发布它在你的dealloc方法(或将其设置为而不是财产。

就看ALAssetsGroup类,你被分配方便的方法调用的结果最有可能的初始化组伊娃 - 如果是这种简便方法是自动释放它返回组对象,所以你需要确保你留住“的将值分配给包含对象中的组变量时的值。 (或者可能更简单,使组成为包含对象的保留属性,并通过属性访问器方法分配)。