2017-02-15 119 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。我創建了一個空項目並複製了原始代碼,但是它沒有問題編譯,我無法找到導致相同錯誤的任何項目設置差異。無論如何,我很高興能找到解決方案,並希望未來能爲幾個可憐的靈魂節省一些時間。