我在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);
}
答案 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;
}
}