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变量时“保留”该值。(或者可能更简单,将组设为包含对象上的保留属性,并通过属性访问器方法进行分配)