加载nib文件

时间:2016-03-16 19:36:43

标签: ios xcode swift interface-builder

我在我的应用程序中遇到了一个非常奇怪的快速崩溃,我刚从Objective-C移植过来。每次我在尝试隔离问题时更改或删除代码时,崩溃的来源似乎都会移动,但我认为我现在已将其缩小到一点。

尝试从nib文件加载视图控制器时,在尝试设置包含UITableView的插座时,我得到一个EXC_BAD_ACCESS。插座是在超类中声明的,但我为了调试目的而覆盖了变量。

超级声明:

class BaseParseQueryViewController<TableViewDatasource: ParseTableViewDatasource> : UIViewController, UITableViewDelegate {

    weak var tableView: UITableView!

    ...
}

子类:

class RestaurantsTableViewController: BaseParseQueryViewController<ParseDatasource<Restaurant, RestaurantTableViewCell>> 

    @IBOutlet var testTableView: UITableView! {
        set {
            super.tableView = newValue
        }

        get {
            return super.tableView
        }
    }

    ...
}

nib指向testTableView变量,并且setter将超类的表视图变量设置为正确的值。但是,在尝试设置超类的变量时出现错误。

这是堆栈跟踪。

* thread #1: tid = 0x5176d, 0x0000000181510160 libobjc.A.dylib`objc_release + 16, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x4696e6978)
frame #0: 0x0000000181510160 libobjc.A.dylib`objc_release + 16
frame #1: 0x00000001000ead2c Roomservice`BaseParseQueryViewController.tableView.setter(value=0x000000014e083000, self=0x000000014de84380) + 112 at BaseParseQueryViewController.swift:0
* frame #2: 0x000000010011547c Roomservice`RestaurantsTableViewController.testTableView.setter(newValue=0x000000014e083000, self=0x000000014de84380) + 172 at RestaurantsTableViewController.swift:21
frame #3: 0x00000001001153bc Roomservice`@objc RestaurantsTableViewController.testTableView.setter + 68 at RestaurantsTableViewController.swift:0
frame #4: 0x000000018279f774 Foundation`-[NSObject(NSKeyValueCoding) setValue:forKey:] + 268
frame #5: 0x0000000187350ba0 UIKit`-[UIViewController setValue:forKey:] + 104
frame #6: 0x00000001874b3150 UIKit`-[UIRuntimeOutletConnection connect] + 124
frame #7: 0x0000000181db6948 CoreFoundation`-[NSArray makeObjectsPerformSelector:] + 232
frame #8: 0x00000001874b1b38 UIKit`-[UINib instantiateWithOwner:options:] + 1748
frame #9: 0x0000000187353fc0 UIKit`-[UIViewController _loadViewFromNibNamed:bundle:] + 376
frame #10: 0x0000000187119b5c UIKit`-[UIViewController loadView] + 176
frame #11: 0x00000001000ec378 Roomservice`BaseParseQueryViewController.loadView(self=0x000000014de84380) -> () + 172 at BaseParseQueryViewController.swift:71
frame #12: 0x00000001000ec52c Roomservice`@objc BaseParseQueryViewController.loadView() -> () + 84 at BaseParseQueryViewController.swift:0
frame #13: 0x0000000186fdc718 UIKit`-[UIViewController loadViewIfRequired] + 144
frame #14: 0x000000018709cee0 UIKit`-[UINavigationController _layoutViewController:] + 72
frame #15: 0x000000018709cdb8 UIKit`-[UINavigationController _updateScrollViewFromViewController:toViewController:] + 416
frame #16: 0x000000018709c000 UIKit`-[UINavigationController _startTransition:fromViewController:toViewController:] + 144
frame #17: 0x000000018709bba4 UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 868
frame #18: 0x000000018709b7cc UIKit`-[UINavigationController __viewWillLayoutSubviews] + 60
frame #19: 0x000000018709b734 UIKit`-[UILayoutContainerView layoutSubviews] + 208
frame #20: 0x0000000186fd8010 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 656
frame #21: 0x000000018497eac0 QuartzCore`-[CALayer layoutSublayers] + 148
frame #22: 0x00000001849796cc QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 292
frame #23: 0x000000018497958c QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32
frame #24: 0x0000000184978bbc QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 252
frame #25: 0x0000000184978904 QuartzCore`CA::Transaction::commit() + 512
frame #26: 0x0000000184971e70 QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 80
frame #27: 0x0000000181e487b0 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
frame #28: 0x0000000181e46554 CoreFoundation`__CFRunLoopDoObservers + 372
frame #29: 0x0000000181d70d30 CoreFoundation`CFRunLoopRunSpecific + 416
frame #30: 0x000000018704b64c UIKit`-[UIApplication _run] + 460
frame #31: 0x0000000187045e54 UIKit`UIApplicationMain + 204
frame #32: 0x0000000100128594 Roomservice`main + 144 at AppDelegate.swift:17
frame #33: 0x000000018190e8b8 libdyld.dylib`start + 4

有没有人对导致这种情况的原因有甚么线索?

2 个答案:

答案 0 :(得分:0)

协议不应该声明弱等... ... ...(虽然如果你的话,我会感到震惊)。

你应该得到一个错误陈述&#34;弱者不能适用于非阶级......&#34; ...

另一个应该出现计算机错误的地方是在编码期间,有类似的内容:

class MainVS: UIViewController  {    
    weak var myString: String!
}

由于@hhanesand州会删除weak,只需使用@IBOutlet varvar

答案 1 :(得分:0)

这可能是由于我安装的beta Xcode版本捆绑的swift发行版中的一个错误引起的。升级到最新的beta修复了这个问题。代码现在无需更改。