2016-07-30 56 views
-1

這看起來很明顯,但我很絆倒如何在swift中處理成員變量的內存。 這裏是一個示例代碼 -在swift viewcontroller中跨越調用的成員變量內存

class TwitMeTableViewController: UITableViewController{ 
    var userTweets:[AnyObject]!{ 
     didSet{ 
      print("?? TweetCount is \(userTweets.count)??") // 3 
      updateUI() 
     } 
    } 
    var session:TWTRSession!{ 
     didSet{ 
stTwitter.getHomeTimelineSinceID(nil, count: 30, successBlock: { (tweets) in 
      self.userTweets = tweets // 2 
} 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.userTweets = [] // 1 
    } 

    func updateUI(){ 
     self.tableView.reloadData() 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     if let tweets = userTweets{ 
      return tweets.count // 4 
     } 
     return 0 
     } 
} 

正如你所看到的,我初始化userTweets在viewDidLoad中(1)和替換它,當我真正得到推特(2)。 然後在didSet有一個更新UI(3)調用啓動。但在numberOfRowsInSection4)的計數結果爲零這是當userTweets在viewDidLoad中被初始化什麼(1

有人能解釋這是怎麼回事,如何userTweet應當被初始化,以及如何新的價值觀應該被添加到同一個變量。 注意會話在用戶從不同的屏幕/視圖登錄時被初始化。

+0

'tweets'從2哪裏來?你有沒有在2處設置斷點?你有兩次收到推特計數記錄嗎? – Paulw11

+0

你的代碼沒有意義。你寫'self.userTweets = tweets',但沒有這樣的'tweets',所以你的代碼不可能編譯。您已經省略了一些非常重要的內容 - 您沒有向我們展示您的真實代碼。那麼,誰能提供幫助? – matt

+0

@matt更多代碼已添加。 – katch

回答

0

有一個單獨的模型類。

在您的視圖控制器中,您將獲得對您的模型類的一個實例的引用,該實例在啓動時僅實例化一次。

有幾種模式如何將模型與視圖分開,以及如何將此模型引用到視圖控制器中。

一個非常簡單的例子就是在AppDelegate中實例化並保存對模型的引用。然後當你初始化你的ViewController時,你可以向你的AppDelegate請求一個模型實例。

有更多優雅的模式,但都有共同之處,即將模型與ViewControllers分開。

+0

嗯,我試圖在AppDelegate中避免模型。我正在考慮爲模型創建一個單例。希望獲得更多關於其他模式的指針。 – katch

+0

小心alwas持有對你的單例的引用,這樣你就不會一遍又一遍地初始化它。我的一些應用程序需要一些時間來填充模型,所以我喜歡在啓動應用程序時啓動一個後臺進程。重要的部分是分離你的模型。你使用哪種模式取決於你。 –

相關問題