2013-05-17 86 views
1
-(void) vCreateAddressBookAndPopulateContact 
{ 
    self.addressBook =ABAddressBookCreate(); 
} 
+(void) vCreateAddressBookAndPopulateContact 
{ 
    [[RCABAddressBookHandler singleton] vCreateAddressBookAndPopulateContact]; 
    //[self 
} 

代碼是正確的。它創建了一個地址簿。當應用程序不在時,地址簿將在dealloc中發佈。如何在這種情況下靜默內存泄漏警告

我確實有記憶警告,我不知道該怎麼辦?

這是屬性的聲明方式

@property (nonatomic) ABAddressBookRef addressBook; 

我釋放,在課程的dealloc

-(void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter]removeObserver:self]; 
    CFRelease(_addressBook); 
} 

我們得到的警示是:

/business/Dropbox/badgers/RecentContact/RCABAddressBookHandler.m:52:1: Potential leak of an object 
/business/Dropbox/badgers/RecentContact/RCABAddressBookHandler.m:51:23: Call to function 'ABAddressBookCreate' returns a Core Foundation object with a +1 retain count 
/business/Dropbox/badgers/RecentContact/RCABAddressBookHandler.m:52:1: Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1 
+0

你能發表這個嗎? ABAddressBookCreate();你在使用ARC嗎? –

+0

詳細描述你所得到的記憶警告。這是一個低內存警告發送到您的應用程序?靜態分析後的內存警告?使用儀器檢測到內存泄漏? –

+0

是的,我正在使用ARC。添加的內存警告: –

回答

1

如果這是唯一的你設置_addressBook,你可以使用直接訪問來指定它:

- (void)vCreateAddressBookAndPopulateContact 
{ 
    /* not thread safe */ 
    if (NULL == _addressBook) { 
     _addressBook = ABAddressBookCreate(); 
    } 
} 

然後將屬性更改爲readonly

+0

它的工作原理,但如何? –

+0

@SeptiadiAgus在這種情況下,因爲setter已經從等式中消除了,並且靜態分析器不評估對ivars的訪問(由於它們可能在程序的其他部分潛在訪問,所以它不能可靠地跟蹤它們)。如果案例不是那麼簡單,那麼你會改爲實現一個setter,然後寫' - (void)vCreateAddressBookAndPopulateContact {AddressBookRef ab = ABAddressBookCreate(); \ n self.addressBook = ab; \ n CFRelease(ab); ''。個人而言,我傾向於分配這些在初始化程序中不會更改的ivars(如果可能)。 – justin