如何在不崩溃的情况下引用其他类的实例?

时间:2015-03-11 15:16:08

标签: ios swift

我有一个简单的问题,我很难找到答案二。下面的代码崩溃了。从调试它似乎来自一个循环,我认为这是因为我引用了两个类中的其他类。有人可以解释一下发生了什么,如果可能,请说明我如何让两个课程相互交谈(两种方式)?任何帮助将非常感谢!谢谢。

  

查看Controller One

import UIKit

class ViewControllerOne: UIViewController{

    let doSomething = DoSomething()
    var one = "test"

    @IBAction func buttonTapped(sender: AnyObject) {
        doSomething.functionTwo()
   }
}
  

做点什么此崩溃

import UIKit

class DoSomething: NSObject {

    let viewControllerOne = ViewControllerOne()

    func functionTwo() -> String{
        var two = viewControllerOne.one
    return two
    }
}
  

做点什么这项工作

import UIKit

class DoSomething: NSObject {


    func functionTwo() -> String{
        let viewControllerOne = ViewControllerOne()

        var two = viewControllerOne.one
    return two
    }
}

2 个答案:

答案 0 :(得分:1)

首先,DoSomething的初始化程序必须创建ViewControllerOne。由于ViewControllerOne的初始化程序创建DoSomething,因此它们无限循环。 在第二个实例中DoSomething在调用functionTwo()之前不会创建,因此没有循环。 你可以让他们互相交谈,例如:

import UIKit

class ViewControllerOne : UIViewController 
{        
    let doSomething = DoSomething()
    var one = "test"

    override func viewDidLoad()
    {
        super.viewDidLoad()
        doSomething.viewControllerOne = self      
    }

    @IBAction func buttonTapped(sender: AnyObject)
    {
        doSomething.functionTwo()
    }
}

class DoSomething: NSObject
{    
    weak var viewControllerOne : ViewControllerOne?

    func functionTwo() -> String
    {
        return viewControllerOne?.one ?? String()
    }
} 

-

所以这就是它的步骤:

  1. 创建ViewControllerOne,调用默认初始值设定项。 它调用doSomething = DoSomething()和var one =“test”的初始值设定项(这等于String(“test”))。
  2. DoSomething默认初始值设定项将可选的viewControllerOne设置为nil
  3. 当ViewControllerOne的实例完成加载时,将调用viewDidLoad。它将弱doSomething.viewControllerOne属性设置为自身。这意味着:
    • 引用计数(用于ARC)不会增加,这很重要,因为如果您决定删除ViewControllerOne的实例,并且doSomething将保留对它的强引用,那么ARC将永远不会删除它们会失去记忆
    • 该属性引用了一个名为viewDidLoad的视图实例,其中Swift中的self与其他语言中的this类似
  4. 调用functionTwo时,它返回值one或者如果viewControllerOne为nil则返回空字符串

答案 1 :(得分:0)

课程从不说话。它们是蓝图。

您的意思是需要进行通信的类的实例。两种方式: 每个实例都有对另一个实例的引用 或实例将消息发送到充当postmaster的第三个对象。有关如何在应用程序内进行通信而不通过引用了解其他对象的详细信息,请参阅NSNotification。

相关问题