2017-02-15 120 views
3

我正在尝试创建应用程序的存档,但构建iOS设备时出现分段错误。在为模拟器构建时,我不会遇到这个问题。到目前为止,我有:分割错误11,Xcode 8.2.1,Swift 3

  • 打扫我的项目
  • 清理我的build文件夹
  • 删除我的派生数据文件夹
  • 安装了Mac OS塞拉利昂更新到塞拉利昂
  • 安装额外的Xcode工具
  • 重新启动Xcode /电脑多次

错误或通常是这样的:

Call parameter type does not match function signature! 
0 swift     0x000000010f4ab3ad PrintStackTraceSignalHandler(void*) + 45 
1 swift     0x000000010f4aab56 SignalHandler(int) + 790 
2 libsystem_platform.dylib 0x00007fffb1b28bba _sigtramp + 26 
3 libsystem_platform.dylib 0x000000011033a000 _sigtramp + 1585517664 
4 swift     0x000000010f3038e8 llvm::TypeFinder::incorporateValue(llvm::Value const*) + 296 
5 swift     0x000000010f3032fa llvm::TypeFinder::run(llvm::Module const&, bool) + 682 
6 swift     0x000000010f1c827e (anonymous namespace)::TypePrinting::incorporateTypes(llvm::Module const&) + 30 
7 swift     0x000000010f1c9bdb printAsOperandImpl(llvm::Value const&, llvm::raw_ostream&, bool, llvm::ModuleSlotTracker&) + 171 
8 swift     0x000000010f30c633 (anonymous namespace)::VerifierSupport::Write(llvm::Value const*) + 67 
9 swift     0x000000010f31616e (anonymous namespace)::Verifier::VerifyCallSite(llvm::CallSite) + 590 
10 swift     0x000000010f318ef3 (anonymous namespace)::Verifier::visitCallInst(llvm::CallInst&) + 35 
11 swift     0x000000010f329ac1 (anonymous namespace)::VerifierLegacyPass::runOnFunction(llvm::Function&) + 1649 
12 swift     0x000000010f2e089d llvm::FPPassManager::runOnFunction(llvm::Function&) + 973 
13 swift     0x000000010f2e02ab llvm::FPPassManager::runOnModule(llvm::Module&) + 43 
14 swift     0x000000010f2e977a llvm::legacy::PassManager::run(llvm::Module&) + 1514 
15 swift     0x000000010c605901 performLLVM(swift::IRGenOptions&, swift::DiagnosticEngine&, llvm::sys::SmartMutex<false>*, llvm::GlobalVariable*, llvm::Module*, llvm::TargetMachine*, llvm::StringRef) + 5921 
16 swift     0x000000010c6038c1 performIRGeneration(swift::IRGenOptions&, swift::ModuleDecl*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 2625 
17 swift     0x000000010c4b8f31 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*) + 23777 
18 swift     0x000000010c4b12b3 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 17859 
19 swift     0x000000010c46d5cf main + 8239 
20 libdyld.dylib   0x00007fffb191b255 start + 1 

在堆栈转储,有这样一行:

2. Running pass 'Module Verifier' on function '@_TZFC12MyAppName23MyClassNameg13nextImagePathV10Foundation3URL' 

我认为这表明编译静态计算的变量nextImagePath,它返回一个URL时抛出的错误到文件路径。在内部,这依赖于一些其他计算变量和方法nextFilePathForDirectoryAtURL。总之,代码如下:

/* 
* This is the offending computed variable. 
*/ 

static var nextImagePath: URL { 
    return nextFilePathForDirectoryAtURL(imageDirectory, withExtension: "jpg"); 
} 

/* 
* The method called by above variable. It looks through all the 
* files in a directory, finds the one with the highest index, 
* and returns a new path by incrementing the highest index by 1. 
*/ 

fileprivate static func nextFilePathForDirectoryAtURL(_ url: URL, withExtension ext: String) -> URL { 
    guard let files = try? FileManager.default.contentsOfDirectory(
    at: url, 
    includingPropertiesForKeys: nil, 
    options: .skipsHiddenFiles) else { 
     fatalError("Could not create next file path for directory at url: \(url)"); 
    } 

    var maxFileNumber = 0; 
    for file in files { 
    let fileName = file.deletingPathExtension().lastPathComponent; 

    guard 
     let fileNumber = Int(fileName), 
     file.pathExtension.lowercased() == ext.lowercased() 
     else { continue } 

    maxFileNumber = max(maxFileNumber, fileNumber); 
    } 

    return url.appendingPathComponent("\(maxFileNumber + 1).\(ext)"); 
} 

/* 
* Some supporting computed variables for constructing directories. 
*/ 

fileprivate static var libraryDirectory: URL { 
    guard let url = try? FileManager.default.url(
    for: .libraryDirectory, 
    in: .userDomainMask, 
    appropriateFor: nil, 
    create: true) else { 
     fatalError("Could not create library directory url."); 
    } 

    return url; 
} 

fileprivate static var documentSetDirectory: URL { 
    let directory = libraryDirectory.appendingPathComponent("MemberDocumentSets"); 

    try? FileManager.default.createDirectory(
    at: directory, 
    withIntermediateDirectories: true, 
    attributes: nil); 

    return directory; 
} 

fileprivate static var imageDirectory: URL { 
    let directory = documentSetDirectory.appendingPathComponent("Images"); 

    try? FileManager.default.createDirectory(
    at: directory, 
    withIntermediateDirectories: true, 
    attributes: nil); 

    return directory; 
} 

我真的不知道为什么这个错误发生,或者为什么建设模拟器时,它不会发生。我一直在尝试找到大约5个小时的答案,但没有运气,所以我想过后。任何帮助是极大的赞赏。谢谢!

回答

0

在几个小时之后,我能够推断出错误是由documentSetDirectory计算的变量造成的。显然,编译器并不乐意将try语句的结果转换为可选语句。相反,我不得不将这个声明包装在do catch区块中。下面的代码解决了我的问题:

fileprivate static var documentSetDirectory: URL { 
    let directory = libraryDirectory.appendingPathComponent("MemberDocumentSets"); 

    do { 
    try FileManager.default.createDirectory(
     at: directory, 
     withIntermediateDirectories: true, 
     attributes: nil); 
    } catch { 

    /* 
    * Do nothing. So why have a catch block at all? Because: for some reason 
    * this prevents the compiler from spitting up. Apparently it didn't like 
    * converting the `try` to an optional here. Weirdly, I'm still doing the 
    * optional conversion elsewhere in this same class without issue (see 
    * computed variables below). 
    * 
    * ¯\_(ツ)_/¯ 
    */ 
    } 

    return directory; 
} 

fileprivate static var imageDirectory: URL { 
    let directory = documentSetDirectory.appendingPathComponent("Images"); 

    try? FileManager.default.createDirectory(
    at: directory, 
    withIntermediateDirectories: true, 
    attributes: nil); 

    return directory; 
} 

很明显,这肯定是编译器的一个bug。我创建了一个空项目并复制了原始代码,但是它没有问题编译,我无法找到导致相同错误的任何项目设置差异。无论如何,我很高兴能找到解决方案,并希望未来能为几个可怜的灵魂节省一些时间。