ios – 尝试在Swift中访问无主引用总是会导致应用程序崩溃

ios – 尝试在Swift中访问无主引用总是会导致应用程序崩溃,第1张

概述在WWDC 2014之前,我学习了Objective-C.我创建了一个“Elevator Simulator”应用程序,仅仅是为了我的学习目的.当您单击七个按钮中的一个时,它会关闭电梯门(动画),一次向所选级别移动一级(如文本标签和按钮着色所示),然后重新打开门. 继WWDC和Swift宣布之后,我正试图在Swift中重新创建这个应用程序.到目前为止,我发现Swift更适合使用,但我遇到了一个涉及 在WWDC 2014之前,我学习了Objective-C.我创建了一个“Elevator Simulator”应用程序,仅仅是为了我的学习目的.当您单击七个按钮中的一个时,它会关闭电梯门(动画),一次向所选级别移动一级(如文本标签和按钮着色所示),然后重新打开门.

继WWDC和Swift宣布之后,我正试图在Swift中重新创建这个应用程序.到目前为止,我发现Swift更适合使用,但我遇到了一个涉及无主参考的主要障碍.应用程序启动正常,直到我实现了文本标签和按钮着色的功能,以根据应用程序启动时Elevator模型的属性进行设置.实现这些功能后,应用程序始终在启动时崩溃.

最终,我将问题范围缩小到从视图控制器到Elevator模型的任何调用.在注释掉我的视图控制器方法的调用以更新界面后,应用程序再次启动正常,我可以确认问题是仅通过尝试调用初始化程序来调用Elevator模型.以下代码片段重现了此问题:

应用代表:

var window: UIWindow?let mainElevator = Elevator()func application(application: UIApplication,dIDFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {    window = UIWindow(frame: UIScreen.mainScreen().bounds)    mainElevator.vIEw = VIEwController(elevator: mainElevator)    window!.rootVIEwController = mainElevator.vIEw    window!.makeKeyAndVisible()    return true}

电梯(型号):

class Elevator: NSObject {    var vIEw: VIEwController?    var currentLevel = 1    var newLevel: Int?}

视图控制器:

class VIEwController: UIVIEwController {    uNowned let elevator: Elevator    init(elevator: Elevator) {        self.elevator = elevator        super.init(nibname: nil,bundle: nil)        //self.elevator.currentLevel = 3    }}

注意:我在这些类中发布了其他方法,因为它们似乎没有对该问题产生影响.我已经通过使用Person和CreditCard示例(用作Apple的示例)创建了一个类似的场景来确认这一点,该示例仅包含我上面粘贴的部分.

随着最后一行VIEwController被注释掉,应用程序启动正常(显示基于loadVIEw()和vIEwDIDLoad()的视图),但如果我取消注释它,应用程序崩溃.如果我将引用类型更改为弱和可选,它也可以正常工作,但它不应该是弱,可选或变量.电梯将始终存在(但不一定是视图,由于多任务),它应该是不变的.这正是Apple在Person / CreditCard场景中描述的那种情况.

另外,如果我删除自己.从最后一个齿轮(因此使用本地版本的电梯),它工作正常.所以模型没有被解除分配,只是无效的参考不起作用.

编辑:崩溃报告

libswift_stdlib_core.dylib`_swift_abortRetainUNowned:0x1001c3980:  pushq  %rbp0x1001c3981:  movq   %rsp,%rbp0x1001c3984:  leaq   0x176a7(%rip),%rax       ; "attempted to retain deallocated object"0x1001c398b:  movq   %rax,0x792ce(%rip)       ; gCRAnnotations + 80x1001c3992:  int3   0x1001c3993:  nopw   %cs:(%rax,%rax)        Thread 1: EXC_BREAKPOINT (code=EXT_1386_BPT,subcode=0x0)
解决方法 我想这是一个错误.

如果您的Elevator类没有从NSObject继承,它可以工作.否则会收到很长的错误消息.

class Elevator {    var vIEw: VIEwController?    var currentLevel = 1    var newLevel: Int?}
总结

以上是内存溢出为你收集整理的ios – 尝试在Swift中访问无主引用总是会导致应用程序崩溃全部内容,希望文章能够帮你解决ios – 尝试在Swift中访问无主引用总是会导致应用程序崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1023392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存