为什么我不能直接分配dataSource?

时间:2015-06-29 19:46:08

标签: swift uitableview datasource

我想了解为什么跟随Swift代码不起作用,但使用注释版本呢。我不确定dataSource是否通常包含在一个单独的类中,但我认为这不重要。我正在使用Xcode 6.3.2,这些都是最新的。

// MainViewController.swift
import UIKit
class MainViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!

    var dataSource:UITableViewDataSource?

    override func viewDidLoad() {
        super.viewDidLoad()

        // dataSource = MainTableViewDataSource()
        // tableView.dataSource = dataSource

        tableView.dataSource = MainTableViewDataSource()
    }
}

MainTableViewDataSource只是一个实现UITableViewDataSource协议并使用一些虚拟数据的类。

// MainTableViewDataSource.swift
import UIKit

class MainTableViewDataSource : NSObject, UITableViewDataSource {
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 100
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1000
    }

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return String(section + 1)
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = UITableViewCell()
        cell.textLabel?.text = "Joejoe"

        return cell
    }
}

1 个答案:

答案 0 :(得分:4)

根据Apple的文档https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/#//apple_ref/occ/instp/UITableView/dataSource

Swit中的 dataSource 属性是无主,对于Objective-C (assign)意味着此属性不会增加引用计数。因此,在 viewDidLoad 函数之后,当 MainTableViewDataSource 的引用计数变为零时,它将被取消分配。

我建议阅读:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

如果你不做正确的记忆管理,你会遇到奇怪的结果 - 有时甚至是不一致的。