【问题标题】:Swift Variable lost in Memory but visible in debuggingSwift 变量在内存中丢失但在调试中可见
【发布时间】:2018-10-03 05:50:02
【问题描述】:

我正在访问我的一个函数中的一个变量,该变量是从其他几个函数传递的,但是当它到达我在这个最终函数中使用它的行时,我得到一个EXC_ACCESS_ERROR,但是我可以检查调试器中的值并确认它有一个值。

从顶部开始,我将展示函数调用的堆栈:

首先,在我的 ViewController 内部,有一个 CoreData 模型变量

var expense : Expense?

*它在前一个 viewController 中被赋值

然后,在同一个 ViewController 中,我调用第一个函数:

TimekeeperClient.sharedInstance().getExpenseAttachments(expenseID: expense.tkID) { (success, statusCode) in
   //Do some work
}

getExpenseAttachments里面,代码如下,我调用下一个函数:

func getExpenseAttachments(expenseID: Int64,completion completionHandlerForAttachments: @escaping (_ success: Bool, _ statusCode: Int?) -> Void)
{
    let url = Methods.getExpenseAttachmentsListUrl(expenseID: Int(expenseID))
    Alamofire.request(url, headers: getHeaders()).responseArray { (response : DataResponse<[AttachmentResponse]>) in
        guard let attachmentsResponse = response.result.value else
        {
            print("Could not map attachments from server response")
            completionHandlerForAttachments(response.result.isSuccess, response.response?.statusCode)
            return
        }

        let attachmentsToSync = AttachmentRepository.getUnsyncedExpenseAttachments(expenseID: expenseID,tkExpenseAttachmentList: attachmentsResponse)

        //Do some other stuff
        }
    }
}

重要提示:请注意,在执行 let url = Methods.getExpenseAttachmentsListUrl(expenseID: Int(expenseID)) 行时,从上一个函数传入的 expenseID 值确实有一个值。

然后,下一个最终函数调用(以及问题所在)是AttachmentRepository.getUnsyncedExpenseAttachments(...。该函数具有以下主体:

static func getUnsyncedExpenseAttachments(expenseID: Int64, tkExpenseAttachmentList: [AttachmentResponse]) -> [AttachmentResponse] {

    var attachmentResponse:[AttachmentResponse] = [AttachmentResponse]()

    //Get Core Data Attachment List
    let attachmentRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Attachment")
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: false)
    let predicate = NSPredicate(format: "expense.tkID == %@", expenseID)
    attachmentRequest.sortDescriptors = [sortDescriptor]
    attachmentRequest.predicate = predicate

    //Do some CoreData Stuff
}

当尝试访问费用 ID 变量时,应用程序崩溃,let predicate = NSPredicate(format: "expense.tkID == %@", expenseID) 行上的 EXC_ACCESS_ERROR。奇怪的是,如果我将鼠标悬停在变量上,我可以看到 xcode 显示 "15543" 的预期值。

我错过了什么?

【问题讨论】:

  • 您可以尝试在 swift 中使用字符串插值给出谓词,或者尝试将 %@ 替换为 %i。也许这会有所帮助:stackoverflow.com/questions/31884863/…
  • 不要使用“%@”作为Int64,您应该使用%llu
  • 谢谢@Larme,解决了它!我仍然很困惑为什么我抛出了访问错误并且没有给我一个更相关的 NSPredicate 错误。
  • 这将在带有UInt64 myInt = 64; NSLog(@"MyInt: %@", myInt); 的Objective-C 中发生,它与stringWithFormat: 使用的逻辑有关,它不检查类型和占位符,只是直接“替换”它们可能导致碰撞。所以在 Swift 中,应该是类似的。

标签: ios swift core-data memory-management thread-safety


【解决方案1】:

感谢Larme,我现在不认为问题出在我的 NSPredicate 语句的语法上 - 将其从 expense.tkID == %@ 更改为 expense.tkID == %llu 修复了它。

然而,我对访问错误感到困惑,因为我虽然无法访问费用 ID,但访问错误发生在 NSPredicate 内部的某处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2011-04-18
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2015-11-21
    • 2021-11-07
    相关资源
    最近更新 更多