使用CFRelease进行ABRecordCopyValue时内存仍在增加?

lem*_*mta 5 iphone memory-leaks memory-management objective-c

我有一个问题让人头疼,我只是创建方法:

-(void) main{

      for (int i = 0; i< 100;i++) {
           [self getPhoneOfContact:i];
      }
 }

-(void)getPhoneOfContact:(NSInteger)id_contact {

     ABRecordRef record = ABAddressBookGetPersonWithRecordID(addressBook,id_contact);

     CFTypeRef ref1;
     ref1 = ABRecordCopyValue(record,kABPersonPhoneProperty);

     CFRelease(record);
     CFRelease(ref1); 
}
Run Code Online (Sandbox Code Playgroud)

我认为内存将近似常数,因为我已经复制了释放内存,但实际上它仍然会增加每个循环i; 谁能解释一下这个:(谢谢!

Ste*_*ntz 5

你的代码错了.ABAddressBookGetPersonWithRecordID调用遵循Core Foundation的"获取规则".这意味着您没有返回值的所有权,因此您不必释放它.

请参阅核心基础 - 内存管理


Ada*_*Woś 0

ABAddressBookGetPersonWithRecordID运行和/或使用一些您不知道的自动释放对象可能ABRecordCopyValue会导致内存增加。不过,当最近的自动释放池耗尽时,它将被释放。这不是您的应用程序的问题。

尝试将循环放入其自己的自动释放池中,并在执行循环后耗尽该池:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// do computation
[pool release];
Run Code Online (Sandbox Code Playgroud)

这会将内存“重置”到初始数量吗?

另外,一般来说,尝试使用 XCode 的 Instruments Memory Leaks,而不是查看内存使用情况 - 这只会有帮助,但Memory Leaks是查找内存泄漏的主要工具,好吧.. :)