0

这是我用来在我的可可应用程序中使用 nstask 生成 ios 构建的代码。

NSTask *task=[[NSTask alloc]init];
task.launchPath=@"/library/Frameworks/Mono.Framework/Commands/xbuild";
task.arguments= @[@"/p:Configuration=Release",@"/p:Platform=iPhone",@"/p:BuildIpa=false",@"/target:Build",@"/Users/xyz/Projects/SimpleDemo/SimpleDemo.sln"];
NSPipe *pipe=[[NSPipe alloc]init];
[task setStandardOutput:pipe];
NSFileHandle *outputFileHandle;
outputFileHandle = [[NSFileHandle alloc]init];
outputFileHandle=[pipe fileHandleForReading];

[outputFileHandle waitForDataInBackgroundAndNotify];

[[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification object:outputFileHandle queue:nil usingBlock:^(NSNotification *notification){

    NSData *output = [outputFileHandle availableData];
    NSString *outStr = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding];
    NSLog(@"%@",outStr);

    [outputFileHandle waitForDataInBackgroundAndNotify];

}];
@try {
    [task launch];
    [task waitUntilExit];
}
@catch (NSException *exception) {
    NSLog(@"%@",[exception callStackSymbols]);

}
@finally {

}

我在运行代码时收到此错误

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iO S.Common.targets:错误:工具退出,代码:134。输出:警告:(armv7)找不到符号的目标文件符号_xamarin_register_modules 警告:(armv7) 找不到符号的目标文件符号 _xamarin_register_assemblies 警告:(armv7) 找不到符号的目标文件符号 _xamarin_setup 警告:(armv7) 找不到符号的目标文件符号 _main 警告:(armv7) 找不到查找符号 _OBJC_METACLASS_$_MonoTouchAppDelegate 的目标文件符号 警告:(armv7) 找不到符号 _OBJC_CLASS_$_MonoTouchAppDelegate 的目标文件符号

dsymutil(6764,0x7fff78631000) malloc: * 对象 0x6000000fb400 的错误:未分配被释放的指针 *在 malloc_error_break 中设置断点以进行调试

在此构建过程中,.app 生成后出现错误意味着 .app 生成后出现问题。

注意:如果我使用终端运行此命令,则它可以正常工作并且生成 .ipa。问题仅在我使用 nstask 运行此命令时出现。

我正在使用 el capitan 和 xcode 7.1.1。任何帮助,将不胜感激。

4

1 回答 1

0

根据@Itachi 的建议,问题在于启用了 MallocNanoZone。这需要从 NSTask 的环境中显式删除。

这是我从IPABuddy获得的代码

        NSTask *task=[[NSTask alloc]init];

        NSMutableDictionary *theEnvironment = [[NSProcessInfo processInfo].environment mutableCopy];
        if (theEnvironment[@"MallocNanoZone"])
        {
            [theEnvironment removeObjectForKey:@"MallocNanoZone"];
        }

        task.environment = theEnvironment;

希望这可以帮助。

于 2016-08-18T11:53:25.263 回答