2012-02-17 76 views
0

我有一小片的位置代碼更新的ALAssetGroup(相冊),如果用戶更改自己的照片庫:iphone:內存泄漏涉及的NSString

- (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將改爲NSArray)。我還啓用了殭屍並收到類似「*** -[CFString release]: message sent to deallocated instance" and "*** -[CFString class]: message sent to deallocated instance」的消息。我試過用一堆不同的方式分配字符串,沒有一個能正常工作。有人知道這裏發生了什麼嗎?

回答

0

嘗試

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

,並刪除其他版本中此對象。

0

我的第一個猜想是懷疑self.albumIDself.album被聲明爲assign,而不是retaincopy,或者說什麼是錯的loadPhotos。檢查這些屬性的聲明並暫時刪除loadPhotos呼叫。它仍然崩潰?

你分配的字符串的兩個版本是猶太教,但代碼的組織方式使得很難推理。您應該重構它,以便字符串自動釋放或釋放一次。

0

我認爲這個問題很可能與這個組變量的'group'變量和'valueForProperty'調用有關。這可能會在某個地方被釋放。因此,當你從'group'變量的一個屬性初始化'newAlbumId'時,你會得到一個指向隨機存儲器的指針(因爲組對象或已經被釋放),它最終成爲'UIButtonContent'或者有時和'NSArray'。因此,執行'isEqualToString'會得到拋出的錯誤。同樣,這就是爲什麼你得到啓用殭屍的警告。

當你有NSZombies啓用時,你會得到任何有關訪問組變量的警告?

另外如何管理組變量內存引用的對象 - 你分配/初始化,並將其直接分配給包含對象中的iVar(而不是通過屬性訪問器作爲屬性)?如果是這樣,請確保在這個alloc之後不會「釋放」它,因爲它不是一個屬性,它不會被保留在iVar賦值上 - 您只需要在dealloc方法中釋放它(或者將其設置爲財產代替)。

只要查看ALAssetsGroup類,您最有可能通過分配便捷方法調用的結果來初始化組iVar - 如果是這種便捷方法是自動釋放它返回的組對象,那麼您需要確保「保留」當您將其分配給包含對象中的組變量時的值。 (或者可能更簡單一些,使您的包含對象成爲一個保留屬性,並通過屬性訪問器方法進行賦值)。