继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中访问无主引用总是会导致应用程序崩溃所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)