Const char *作为块变量

时间:2015-10-06 21:27:47

标签: objective-c macos objective-c-blocks grand-central-dispatch

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

我想知道__block变量如何适用于非对象或我如何摆脱NSStrings

或者

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

目前正在从字符串中释放~2演出的内存。

以下是目前的情况:

-(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] != '\0'){
            //this is whats killing me the NSString creation of remainder
            [self doSomething:@(remainder)];
         }

    }

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

1 个答案:

答案 0 :(得分:-1)

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

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

         myCoolCFunc(input,&remainder);

         if(remainder != NULL && remainder[0] != '\0'){
            [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] == '\0')
             break;
         input = remainder;
     }
}