如果用户对其照片库进行了更改,我在此处有一段代码可以更新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
”之类的消息。我试过以一堆不同的方式分配字符串,没有一个正常工作。有谁知道这里发生了什么?
答案 0 :(得分:0)
尝试
NSString *newAlbumID = [[NSString alloc] initWithString: [group valueForProperty: ALAssetsGroupPropertyPersistentID] autorelease];
并删除此对象的其他版本。
答案 1 :(得分:0)
我的第一个猜测是怀疑self.albumID
或self.album
被声明为assign
而不是retain
或copy
,或者说有什么问题loadPhotos
。检查这些属性的声明并暂时删除loadPhotos
调用。它还会崩溃吗?
您分配的字符串的两个版本是Kosher,但代码的组织方式使得很难推理。你应该重构它,以便字符串自动释放或释放一次。
答案 2 :(得分:0)
我认为问题很可能与'group'变量和/或对该组变量的'valueForProperty'调用有关。这可能是在某个地方发布的。因此,当您从性质上的“组”变量初始化你的“newAlbumId”你得到分配的指针,随机存储器(自组对象或已发布),这是结束了是一个指针“UIButtonContent”或者有时和'NSArray'。因此,执行'isEqualToString'会获得抛出的错误。与此类似,这就是为什么你会在启用僵尸的情况下收到警告。
如果启用了NSZombies,您是否收到与访问组变量有关的任何警告?
此外,如何管理组变量内存所引用的对象 - 您是分配/初始化并将其直接分配给包含对象中的iVar(而不是通过属性访问器作为属性)?如果是的话请确保你没有“释放”它这页头后,因为既然它是不是没有得到保留在伊娃分配的财产 - 你只需要刚刚发布它在你的dealloc方法(或将其设置为而不是财产。
就看ALAssetsGroup类,你被分配方便的方法调用的结果最有可能的初始化组伊娃 - 如果是这种简便方法是自动释放它返回组对象,所以你需要确保你留住“的将值分配给包含对象中的组变量时的值。 (或者可能更简单,使组成为包含对象的保留属性,并通过属性访问器方法分配)。