iphone:内存泄漏涉及NSString

iphone:内存泄漏涉及NSString,iphone,objective-c,ios,cocoa-touch,memory-leaks,Iphone,Objective C,Ios,Cocoa Touch,Memory Leaks,我这里有一段代码,如果用户更改了他们的照片库,它会更新ALAssetGroup(相册): - (void) ALAssetsLibraryChangedNotification { [[self activityIndicator] startAnimating]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [[self library] enumerateGroupsWithTypes:

我这里有一段代码,如果用户更改了他们的照片库,它会更新
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 isqualtostring:]:发送到实例
”的无法识别的选择器之前工作了很长时间(有时,
UIButtonContent
将改为
NSArray
)。我还启用了僵尸,并获得了类似“
***-[CFString release]:messagesent to deallocated instance”和“***-[CFString class]:messagesent to deallocated instance
”的消息。我尝试过以多种不同的方式分配字符串,但没有一种方法是正确的。有人知道这里发生了什么吗?

试试看

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

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

我的第一个猜测是怀疑
self.albumID
self.album
声明为
assign
,而不是
retain
copy
,或者
loadPhotos
中有错误。检查这些属性的声明,并临时删除
loadPhotos
调用。它还在崩溃吗


您分配的字符串的两个版本都是犹太教版本,但代码的组织方式使其难以推理。您应该重构它,使字符串自动释放或释放一次。

我认为问题很可能与“group”变量和/或对该组变量的“valueForProperty”调用有关。这可能是在你下面的某个地方发布的。因此,当您从“group”变量上的属性初始化“newAlbumId”时,会为您分配一个指向随机内存的指针(自组对象或已被释放),该指针最终指向“UIButtonContent”或有时是“NSArray”。因此,执行“isEqualToString”会得到抛出的错误。同样,这就是为什么启用僵尸时会收到警告

当您启用NSZombies时,是否收到与访问组变量有关的任何警告

另外,组变量内存引用的对象是如何管理的?是否分配/初始化并直接将其分配给包含对象中的iVar(而不是通过属性访问器作为属性)?如果是这样的话,请确保您没有在此alloc之后“释放”它,因为它不是一个属性,因此不会保留在iVar分配中-您只需要在dealloc方法中释放它(或者将其设置为属性)

只要看看AlassetGroup类,您最有可能通过分配便利方法调用的结果来初始化group iVar-如果是这样,这个便利方法将自动删除它返回的group对象,因此您需要确保在将值分配给包含对象中的group变量时“保留”该值。(或者可能更简单,将组设为包含对象上的保留属性,并通过属性访问器方法进行分配)