【发布时间】: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