我正在使用属性setter和didSet()值来设置"完成百分比"属性。所有属性访问都在主队列中完成,我设置的属性没有钩子或getter或setter,对象已完全初始化,我在计算中使用的字段都在那里。
但是,我收到一个令人愤怒的EXC_BREAKPOINT错误而没有其他细节。
我认为这可能是多线程访问问题,但我看到所有其他线程中只有空堆栈。
错误断点:
调试器值:
调用堆栈(这些都是set或didSet):
答案 0 :(得分:3)
您将获得整数溢出,因为您将22,667,272乘以99.使用Int64而不是Int。
您可以存储在32位整数中的最大值是2,147,483,647。 22,667,272 * 99是2,244,059,928,所以你得到一个整数溢出。 Int
的大小因架构而异,因此您的代码将在64位设备上运行,但不在32位上运行。如果明确使用Int64,则可以避免溢出。
let totalBytes = Int64(self.bytesTotal)
let uploaded = Int64(self.bytesUploaded)
self.percentComplete = Int(1 + 99 * uploaded / totalBytes)