簡體   English   中英

iPhone:涉及NSString的內存泄漏

[英]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.albumIDself.album被聲明為assign而不是retaincopy ,或者在loadPhotos 檢查這些屬性的聲明,並臨時刪除loadPhotos調用。 它仍然崩潰嗎?

您分配的字符串的兩個發行版是潔凈的,但是代碼的組織方式使其難以推理。 您應該對其進行重構,以便該字符串可以自動釋放或釋放一次。

我認為問題很可能與“組”變量或此組變量上的“ valueForProperty”調用有關。 這可能在您下方的某個位置被釋放。 因此,當您從“組”變量上的屬性初始化“ newAlbumId”時,您將被分配一個指向隨機存儲器的指針(由於組對象或已被釋放),該指針最終成為“ UIButtonContent”的指針有時是“ NSArray”。 因此,執行“ isEqualToString”會引發拋出的錯誤。 同樣,這就是為什么您收到啟用了僵屍的警告的原因。

啟用NSZombies后,是否會收到有關訪問組變量的任何警告?

另外,如何管理由組變量內存引用的對象-您是否在分配/初始化並將其直接分配給包含對象中的iVar(而不是通過屬性訪問器作為屬性)? 如果是這樣,請確保在分配之后不要“釋放”它,因為它不是屬性,因此不會保留在iVar分配中-您只需要在dealloc方法中釋放它(或將其設置為a屬性)。

僅查看ALAssetsGroup類,您很可能會通過分配便捷方法調用的結果來初始化iVar組-如果是這樣,此便捷方法將自動釋放它返回的組對象,因此您需要確保在保留“值”時將其分配給包含對象中的組變量。 (或者可能更簡單,使組成為包含對象上的保留屬性,然后通過屬性訪問器方法進行分配)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM