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