Const char * 作为块变量

Const char * as block variable

我在 OSX 在 Objective-C 中使用 GCD 的一些相关信息。我有一个产生非常大 const char * 的后台任务,然后将其重新引入到一个新的后台任务中。这个循环基本上重复,直到 const char* 为空。目前我正在块中创建和使用 NSStrings,然后立即返回 char*。正如您可以想象的那样,这会对所有这些进行大量不必要的复制。

我想知道 __block 变量如何为非对象工作或者我如何才能摆脱 NSStrings

或者

如何为非对象类型管理内存?

它目前正在爆炸 ~2 GB 的内存全部来自字符串。

这是目前的样子:

-(void)doSomething:(NSString*)input{
    __block NSString* blockCopy = input;
    void (^blockTask)(void);
    blockTask = ^{
         const char* input = [blockCopy UTF8String];
         //remainder will point to somewhere along input
         const char* remainder = NULL;

         myCoolCFunc(input,&remainder);

         if(remainder != NULL && remainder[0] != '[=10=]'){
            //this is whats killing me the NSString creation of remainder
            [self doSomething:@(remainder)];
         }

    }

    /*...create background queue if needed */
    dispatch_async(backgroundQueue,blockTask);
}

根本不需要使用NSString也不需要使用__block属性:

-(void)doSomething:(const char *)input{
    void (^blockTask)(void);
    blockTask = ^{
         const char* remainder = NULL;

         myCoolCFunc(input,&remainder);

         if(remainder != NULL && remainder[0] != '[=10=]'){
            [self doSomething:remainder];
         }
    }

    /*...create background queue if needed */
    dispatch_async(backgroundQueue,blockTask);
}

也几乎不需要使用递归,因为迭代方法也是可能的。

blockTask = ^{
     const char* remainder = NULL;
     while (YES) {
         myCoolCFunc(input,&remainder);
         if(remainder == NULL || remainder[0] == '[=11=]')
             break;
         input = remainder;
     }
}