Прежде всего, нет необходимости выполнять большую часть этой работы внутри цикла.task
, pipe
и file
все выглядит так, как будто они могут обрабатываться вне цикла.Вам также следует рассмотреть возможность использования точечного синтаксиса Objective-C 2.0 и быстрого перечисления, чтобы немного урезать.
Более существенно:
NSArray *args;
args = [NSArray arrayWithObjects:@"/my/task", [inputarray objectAtIndex:i], nil];
[task setArguments:args];
Это говорит о том, что первый аргумент передается в исполняемый файл впуть ndschat
равен /my/task
.Который, кажется, не соответствует вашему использованию PERL.Вероятно, вы хотите просто:
NSArray *args;
args = [NSArray arrayWithObject:[inputarray objectAtIndex:i]];
[task setArguments:args];
Или, с учетом комментариев стиля:
for(NSString *argument in inputarray)
{
...
task.arguments = [NSArray arrayWithObject:argument];
...
}
РЕДАКТИРОВАТЬ: вы также выпускаете много объектов, которые вам не принадлежат,что, как и добавление к вашему коду лишнего кода, является ошибкой управления памятью, которая может привести к сбою.Итак, чтобы сократить все это и исправить эту ошибку:
for(NSString *argument in inputarray)
{
NSTask *task = [[NSTask alloc] init]; // you now own this
task.launchPath = nsdchat;
NSPipe *pipe = [NSPipe pipe]; // you don't own this
task.standardOutput = pipe;
NSFileHandle *file = [pipe fileHandleForReading]; // you also don't own this
task.arguments = [NSArray arrayWithObject:argument];
[task launch];
[task waitUntilExit]; // you should wait until the task is done
NSData *data = [file readDataToEndOfFile]; // this is another thing
// you don't own. Note also that
// readDataToEndOfFile advances
// the current read pointer, so
// it should be fine to do this
// successively
NSString *desc;
desc = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]
autorelease];
// you don't own this because
// of the autorelease; you
// don't want to own it since
// the next line will throw
// it away
desc = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""];
// you don't own this
[descriptions addObject:desc];
[task release];
}