为什么不能直接赋值dataSource?
Why can I not assign dataSource directly?
我想了解为什么遵循 Swift 代码不起作用,但使用注释版本可以。我不确定数据源是否通常被包装到一个单独的 class 中,但我认为这不重要。我正在使用 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 只是一个 class,它实现了 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
}
}
UITableView 的 dataSource 属性 在 Swift 中是 unowned 即 (assign ) for Objective-C 意味着这个 属性 不会增加引用计数。所以在 viewDidLoad 函数之后,当 MainTableViewDataSource 的引用计数变为零时,它会被释放。
如果内存管理不当,您将 运行 出现奇怪的结果——有时甚至是不一致的。
我想了解为什么遵循 Swift 代码不起作用,但使用注释版本可以。我不确定数据源是否通常被包装到一个单独的 class 中,但我认为这不重要。我正在使用 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 只是一个 class,它实现了 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
}
}
dataSource 属性 在 Swift 中是 unowned 即 (assign ) for Objective-C 意味着这个 属性 不会增加引用计数。所以在 viewDidLoad 函数之后,当 MainTableViewDataSource 的引用计数变为零时,它会被释放。
如果内存管理不当,您将 运行 出现奇怪的结果——有时甚至是不一致的。