Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在AddressBook上运行循环-收到内存警告_Objective C_Memory Management_Abaddressbook - Fatal编程技术网

Objective c 在AddressBook上运行循环-收到内存警告

Objective c 在AddressBook上运行循环-收到内存警告,objective-c,memory-management,abaddressbook,Objective C,Memory Management,Abaddressbook,我运行这段代码是为了创建一个包含呼叫者姓名的图像,并将其设置为特定联系人,但当它运行时,我收到内存警告,它崩溃了 -(void)RunActionInBlack{ //black bg - white text ABAddressBookRef addressBook; CFErrorRef error = NULL; addressBook = ABAddressBookCreate(); CFArrayRef array=ABAddressBookCopyArrayOfAllPeo

我运行这段代码是为了创建一个包含呼叫者姓名的图像,并将其设置为特定联系人,但当它运行时,我收到内存警告,它崩溃了

-(void)RunActionInBlack{


//black bg - white text

ABAddressBookRef addressBook;
CFErrorRef error = NULL;

addressBook = ABAddressBookCreate();

CFArrayRef array=ABAddressBookCopyArrayOfAllPeople(addressBook);

ABRecordRef person;
int len=CFArrayGetCount(array);

for (int i = 0; i<len; i++){
    person = CFArrayGetValueAtIndex(array, i);
     details.text = [NSString stringWithFormat:@"Done. %d of %d contacts", i+1,len];
    [act stopAnimating];
    NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

    if (firstName == NULL) {
        firstName = @"";
    }
    if (lastName == NULL ) {
        lastName = @"";
    }

    UIImage *im = [self addText:[UIImage imageNamed:@"black.png"] andText:[NSString stringWithFormat:@"%@ %@",firstName, lastName]];
    NSData *dataRef = UIImagePNGRepresentation(im);

    ABPersonSetImageData(person, (CFDataRef)dataRef, &error);


    [lastName release];
    [firstName release];
    [dataRef release];
    CFRelease(dataRef);
    [im release];
}
ABAddressBookSave(addressBook, &error);
CFRelease(array);
CFRelease(addressBook);
}
我没有任何内存泄漏之类的

我正在运行这样的方法:
[self-performSelectorInBackground:@selector(RunActionInWhite),对象为nil]


提前感谢。

如果您正在迭代一个大数组并收到内存警告,则您可能正在使用在退出
for
循环之前不会释放的资源。(或者在这种情况下,根本不会发布,因为你的应用程序崩溃了。)

您可能希望在循环中使用

for (int i=0; i<max; i++) {
    @autoreleasepool {

    }
}

for(int i=0;i似乎内存不足,但却保留了许多无法释放的对象,如
addressBook
内容,而且您似乎有一个名为
array
addressBook
的完整副本

所以

  • 你真的需要那本通讯录吗?试着把它扔掉
  • 将迭代分解成更小的部分,在几十条记录的每一块之后保存地址簿,这将释放一些内部使用的资源

接下来,您可以尝试使用工具分析您的分配,看看是什么占用了大部分内存。

这段代码中的内存管理似乎有点差。
CF
引用和目标C对象之间的桥接是一个巨大的混乱…例如
dataRef
不是
CF
引用,
firstName
lastName
CF
引用。这些微小的东西可能会导致严重的内存泄漏。我应该将此自动释放放在哪里?顺便说一句,我正在使用以下方法运行这些方法:[self-performSelectorInBackground:@selector(RunActionInWhite)with object:nil];在for()的for循环内({@autoreleasepool{…})
for (int i=0; i<max; i++) {
    @autoreleasepool {

    }
}