我正在构建一个包含命令行可执行文件的OS X应用程序.应用程序调用可执行文件,传递用户选择的文件名,并使用管道获取输出.执行此操作的代码如下所示:
let bundle = NSBundle(forClass: self.dynamicType)
let binaryPath = bundle.URLForResource("myBundledBinary", withExtension: nil)
let task = NSUserUnixTask(URL: binaryPath!, error: nil)
let stdout = NSPipe()
let stderr = NSPipe()
task.standardOutput = stdout.fileHandleForWriting
task.standardError = stderr.fileHandleForWriting
task.executeWithArguments([filename], completionHandler: { (error) -> Void in
let output = stdout.fileHandleForReading.readDataToEndOfFile()
let error = stderr.fileHandleForReading.readDataToEndOfFile()
let outputString = NSString(data: output, encoding: NSUTF8StringEncoding) ?? ""
let errorReport = NSString(data: error, encoding: NSUTF8StringEncoding) ?? ""
handler([outputString, errorReport], nil)
})
Run Code Online (Sandbox Code Playgroud)
这很好,直到我尝试沙盒应用程序.当这个代码在沙盒应用程序运行时,任务似乎完成,但没有在任stdout或stderr的任何输出(包括outputString和errorReport为空字符串).不会生成错误(error始终为nil),并且不会发生控制台输出.
我的应用程序具有以下权利:
<key>com.apple.security.app-sandbox</key> …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用Objective-C的小型动态库,并将C链接功能公开给Unity(这是一个本机插件)。
即使我的编译器设置将“默认情况下隐藏的符号”设置为“ 是”,并且我正在使用__attribute__((visibility("default")))要公开的函数声明,即使static符号(函数和全局变量)也出现在输出库中。
我已经重新创建了一个测试Xcode项目,该项目最初包含一个C文件。
file.h:
#pragma once
extern __attribute__((visibility("default"))) void not_hidden();
Run Code Online (Sandbox Code Playgroud)
file.c:
#include "file.h"
#include <stdio.h>
static void hidden()
{
printf("I'm hidden\n");
}
void not_hidden()
{
printf("I'm not hidden\n");
hidden();
}
Run Code Online (Sandbox Code Playgroud)
和这工作如广告:
$ nm libHiddenSymbolTest.dylib
0000000000000f40 T _not_hidden
U _printf
U dyld_stub_binder
Run Code Online (Sandbox Code Playgroud)
但是,一旦我添加了具有类似功能的Objective-C文件(not_hidden2(),等),所有的static符号都会被公开:
$ nm libHiddenSymbolTest.dylib
U _CFStringGetCStringPtr
U _NSLog
00000000000054d0 s _OBJC_METACLASS_$___ARCLite__
U __Block_copy
U __DefaultRuneLocale
0000000000005710 b __ZGVZL18add_image_hook_ARCPK11mach_headerlE7patches
0000000000005830 b __ZGVZL22add_image_hook_swiftV1PK11mach_headerlE7patches
0000000000005640 b …Run Code Online (Sandbox Code Playgroud) 我过去曾经用过这个.
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
self.view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)
但现在在Xcode 8 beta中我收到此错误:
声明touchBegan(touches:withEvent)具有与任何潜在覆盖不同的参数名称.
有什么想法吗?