gpt4 book ai didi

ios - swift 中的单例类给出 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 错误

转载 作者:行者123 更新时间:2023-11-28 13:38:35 25 4
gpt4 key购买 nike

我正在编写一个 swift 网络管理器库,专门用于满足我自己的 API 需求。这个类被声明为 final 并且有一个静态的 let 变量来定义这个类的单例设计模式。此类中的所有其他函数都是类函数。

不幸的是,每当这个单例类被调用并且单例设计模式方法,即 static let sharedInstance : NetworkManager = NetworkManager.init() 被调用时,它给了我

stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) error.

我认为线程可能存在问题,但没有。我只是在 UIViewController 的 viewDidLoad 中调用了 NetworkManager.shared,它给了我同样的错误。

我在此提供 NetworkManager 类的全部代码

final class NetworkManager {

static let sharedInstance : NetworkManager = NetworkManager.init()

private var urlConfig = URLSessionConfiguration.default
private var urlSession = URLSession(configuration: sharedInstance.urlConfig)

var basePath : String = "https://api.myjson.com/";

private init() {

print("This is getting called at all");
}
//MARK:- POST METHODS
class func performPOST(urlString : String?, bodyParams : [String : AnyObject]? = nil, completionHandler : @escaping(Result<Data?,NetworkError>) -> Void){
self.performJSON(urlString: urlString, bodyParams: bodyParams, method : .POST, completionHandler: completionHandler)
}

class func performPOST( url : URL?, bodyParams : [String : AnyObject]? = nil, headerParams : [String : Any]? = nil,completionHandler : @escaping(Result<Data?,NetworkError>) -> Void){
self.performJSON(url: url, bodyParams: bodyParams, method : .POST, completionHandler: completionHandler)
}

class func performPOST( request : URLRequest?, completionHandler : @escaping(Result<Data?,NetworkError>) -> Void){
self.performJSON(request: request, completionHandler: completionHandler)
}

//MARK:- JSON FUNCTIONS
class func performJSON(urlString : String?, bodyParams : [String : AnyObject]? = nil, headerParams : [String : Any]? = nil,method : MethodType = .GET , completionHandler : @escaping(Result<Data?,NetworkError>) -> Void){

guard let urlString = urlString, let compURL = URL.init(string: NetworkManager.sharedInstance.basePath + urlString) else {
completionHandler(.failure(.badURL))
return
}

var urlReq = URLRequest.init(url: compURL, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 30)

do {
try self.prepareTheURLRequest( request : &urlReq,
bodyParams : bodyParams,
headerParams : headerParams,
method :method)
}catch let error as NetworkError {
completionHandler(.failure(error))
}catch let error {
completionHandler(.failure(NetworkError.unknownError(error)))
}

self.performJSON(request: urlReq, completionHandler: completionHandler)
}

class func performJSON( url : URL?, bodyParams : [String : AnyObject]? = nil, headerParams : [String : Any]? = nil,method : MethodType = .GET, completionHandler : @escaping(Result<Data?,NetworkError>) -> Void){
}

//MARK:- FIRE_THE_REQUEST
class func performJSON( request : URLRequest?, completionHandler : @escaping(Result<Data?,NetworkError>) -> Void){
if let req = request {
let _ = NetworkManager.sharedInstance.urlSession.dataTask(with: req) { (data, response, error) in
if let er = error{
completionHandler(.failure(NetworkError.unknownError(er)))
}else if let resp = response{
do {
try self.validateTheResponse(response: resp)
completionHandler(.success(data))
} catch let error {
completionHandler(.failure(NetworkError.unknownError(error)))
}
}else{
completionHandler(.failure(NetworkError.noResponseReceived))
}
}
}
}

//MARK:- VALIDATE_RESPONSE
class func validateTheResponse(response : URLResponse) throws {

if let httpResponse = response as? HTTPURLResponse {
let statusCode = httpResponse.statusCode

switch statusCode {

case 200 ... 300 :
break
default:
let newError = NSError(domain: "Improper Status Code Received", code: 42, userInfo: ["statusCode":statusCode] )
throw newError
}
}
}
}

收到错误如下


(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
frame #0: 0x000000010deab9d3 libdispatch.dylib<code>_dispatch_once_wait + 101
frame #1: 0x000000010bd00579 libswiftCore.dylib</code>swift_once + 25 * frame #2: 0x000000010a7bfcd4 MVVM<code>NetworkManager.sharedInstance.unsafeMutableAddressor at
NetworkManager.swift:25:16
frame #3: 0x000000010a7c010a MVVM</code>NetworkManager.(self=0x0000600002756e20).init() at
NetworkManager.swift:28:30
frame #4: 0x000000010a7bfca0 MVVM<code>NetworkManager.__allocating_init() at NetworkManager.swift:0
frame #5: 0x000000010a7bfc4c MVVM</code>globalinit_33_100BB9A6FE18335AA78CDFBEA4A3C62B_func0 at
NetworkManager.swift:25:65
frame #6: 0x000000010deaadb5 libdispatch.dylib<code>_dispatch_client_callout + 8
frame #7: 0x000000010deac83d libdispatch.dylib</code>_dispatch_once_callout + 66
frame #8: 0x000000010bd00579 libswiftCore.dylib<code>swift_once + 25
frame #9: 0x000000010a7bfcd4 MVVM</code>NetworkManager.sharedInstance.unsafeMutableAddressor at
NetworkManager.swift:25:16
frame #10: 0x000000010a7c06c3 MVVM<code>static NetworkManager.performJSON(urlString="bins/9asku", bodyParams=nil,
headerParams=nil, method=POST, completionHandler=0x000000010a7cc650
MVVM</code>partial apply forwarder for closure #1
(Swift.Result, MVVM.NetworkError>) ->
() in MVVM.ListRequest.fetchAllLists(completionHandler:
(Swift.Result>,
MVVM.NetworkError>) -> ()) -> () at ,
self=0x000000010a7d89e8) at NetworkManager.swift:52:88
frame #11: 0x000000010a7c03fa MVVM<code>static NetworkManager.performPOST(urlString="bins/9asku", bodyParams=nil,
completionHandler=0x000000010a7cc650 MVVM</code>partial apply forwarder for
closure #1 (Swift.Result,
MVVM.NetworkError>) -> () in
MVVM.ListRequest.fetchAllLists(completionHandler:
(Swift.Result>,
MVVM.NetworkError>) -> ()) -> () at ,
self=0x000000010a7d89e8) at NetworkManager.swift:38:14
frame #12: 0x000000010a7cc547 MVVM<code>ListRequest.fetchAllLists(completionHandler=0x000000010a7cf740
MVVM</code>closure #1 (Swift.Result>,
MVVM.NetworkError>) -> () in MVVM.ListPresenter.fetchAndShowList() ->
() at ListPresenter.swift:29, self=0x0000600002b1c3a0) at
ListRequest.swift:15:24
frame #13: 0x000000010a7cf726 MVVM<code>ListPresenter.fetchAndShowList(self=0x0000600002779140) at
ListPresenter.swift:29:17
frame #14: 0x000000010a7c5551 MVVM</code>ListVC.viewDidAppear(animated=false, self=0x00007ff125e04540) at
ListVC.swift:33:25
frame #15: 0x000000010a7c55d3 MVVM<code>@objc ListVC.viewDidAppear(_:) at <compiler-generated>:0
frame #16: 0x000000010edb2536 UIKitCore</code>-[UIViewController _setViewAppearState:isAnimating:] + 942
frame #17: 0x000000010edb521c UIKitCore<code>__64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
frame #18: 0x000000010edb35ab UIKitCore</code>-[UIViewController _executeAfterAppearanceBlock] + 75
frame #19: 0x000000010f3b9e05 UIKitCore<code>_runAfterCACommitDeferredBlocks + 634
frame #20: 0x000000010f3a9199 UIKitCore</code>_cleanUpAfterCAFlushAndRunDeferredBlocks + 358
frame #21: 0x000000010f3c7cd9 UIKitCore<code>__34-[UIApplication _firstCommitBlock]_block_invoke_2 + 142
frame #22: 0x000000010ca7eaec CoreFoundation</code><strong>CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK</strong> + 12
frame #23: 0x000000010ca7e2b0 CoreFoundation<code>__CFRunLoopDoBlocks + 336
frame #24: 0x000000010ca78b34 CoreFoundation</code>__CFRunLoopRun + 1252
frame #25: 0x000000010ca78302 CoreFoundation<code>CFRunLoopRunSpecific + 626
frame #26: 0x0000000114b302fe GraphicsServices</code>GSEventRunModal + 65
frame #27: 0x000000010f3aeba2 UIKitCore<code>UIApplicationMain + 140
frame #28: 0x000000010a7caceb MVVM</code>main at AppDelegate.swift:12:7
frame #29: 0x000000010df1f541 libdyld.dylib`start + 1 (lldb)

最佳答案

你的代码中的问题是在这一行

private var urlSession = URLSession(configuration: sharedInstance.urlConfig)

当您创建类的实例时,它的变量也会在内存中分配。但是在这里,您试图在变量初始化完成之前访问它。

要修复崩溃,您可以将变量 urlSession 更改为如下所示:

private var urlSession = URLSession(configuration: URLSessionConfiguration.default)

关于ios - swift 中的单例类给出 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56325809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com