[英]iphone: Memory Leak involving NSString
如果用戶對自己的照片庫進行了更改,我這里有一些代碼可以更新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
”的*** -[CFString release]: message sent to deallocated instance" and "*** -[CFString class]: message sent to deallocated instance
。 我嘗試以多種不同的方式分配字符串,但沒有一種能正常工作。 有人知道這是怎么回事嗎?
嘗試
NSString *newAlbumID = [[NSString alloc] initWithString: [group valueForProperty: ALAssetsGroupPropertyPersistentID] autorelease];
並刪除該對象的其他發行版。
我的第一個猜測是懷疑self.albumID
或self.album
被聲明為assign
而不是retain
或copy
,或者在loadPhotos
。 檢查這些屬性的聲明,並臨時刪除loadPhotos
調用。 它仍然崩潰嗎?
您分配的字符串的兩個發行版是潔凈的,但是代碼的組織方式使其難以推理。 您應該對其進行重構,以便該字符串可以自動釋放或釋放一次。
我認為問題很可能與“組”變量或此組變量上的“ valueForProperty”調用有關。 這可能在您下方的某個位置被釋放。 因此,當您從“組”變量上的屬性初始化“ newAlbumId”時,您將被分配一個指向隨機存儲器的指針(由於組對象或已被釋放),該指針最終成為“ UIButtonContent”的指針有時是“ NSArray”。 因此,執行“ isEqualToString”會引發拋出的錯誤。 同樣,這就是為什么您收到啟用了僵屍的警告的原因。
啟用NSZombies后,是否會收到有關訪問組變量的任何警告?
另外,如何管理由組變量內存引用的對象-您是否在分配/初始化並將其直接分配給包含對象中的iVar(而不是通過屬性訪問器作為屬性)? 如果是這樣,請確保在分配之后不要“釋放”它,因為它不是屬性,因此不會保留在iVar分配中-您只需要在dealloc方法中釋放它(或將其設置為a屬性)。
僅查看ALAssetsGroup類,您很可能會通過分配便捷方法調用的結果來初始化iVar組-如果是這樣,此便捷方法將自動釋放它返回的組對象,因此您需要確保在保留“值”時將其分配給包含對象中的組變量。 (或者可能更簡單,使組成為包含對象上的保留屬性,然后通過屬性訪問器方法進行分配)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.