2016-11-24 10 views
0

私は、クロージャを使用して、弱い自己構文なしで自己を参照するvarまたは怠惰なvarを初期化する多くのコードを見てきました。保持サイクルのリスクを引き起こすものではありませんか?なぜコンパイラはそれにフラグを立てていないのですか?安全対策としてあらゆる種類の閉鎖を使用する場合、常に弱い自己または所有されていない自己を使用することは必須のことでしょうか?Swiftのすべての変数または遅延変数イニシャライザに弱い自己が含まれている必要がありますか?

class Test { 
    lazy var tableView: UITableView = { 
    let tableView = UITableView(frame: self.view.bounds, style: .plain) 
    tableView.delegate = self 
    tableView.dataSource = self 

    return tableView 
    } 
}() 
+1

関連:[レイジー初期化サイクルを保持する(http://stackoverflow.com/q/38141298/2976878) – Hamish

答えて

3
ここ [unowned self]を使用する必要がないので、閉鎖のプロパティが何によって保持されていないではありません

怠惰な変数:

class Test { 
    lazy var tableView: UITableView = { 

     let tableView = UITableView(frame: self.view.bounds, style: .plain) 
     tableView.delegate = self 
     tableView.dataSource = self 
     return tableView 
    }() 
} 

をこの遅延的に定義されている閉鎖のプロパティと混同すべきではありません!その後、クロージャーは自己をキャプチャし、保持サイクルを作成します。この場合、self.view.boundsを介して強い参照を作成していますので、[unowned self]を使用してください(この場合は、Testオブジェクトが存在しない場合はtableViewは存在しないはずです)。

class Test { 
    lazy var tableView:() -> UITableView = { 
     [unowned self] in 

     let tableView = UITableView(frame: self.view.bounds, style: .plain) 
     tableView.delegate = self 
     tableView.dataSource = self  
     return tableView 
    } 
} 

さらにリーディング:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

https://krakendev.io/blog/weak-and-unowned-references-in-swift

関連する問題