zoukankan      html  css  js  c++  java
  • swif-自动引用计数

    import UIKit
    
    
    /*
    class Person {
        let name: String
     
     //强引用
        init(name: String) {
            self.name = name
            print("(name) is being initialized")
        }
     
     //引用计数销毁时
        deinit {
            print("(name) is being deinitialized")
        }
    }
    */
    
    class Person {
        let name: String
        init(name: String) { self.name = name }
        var apartment: Apartment?
        deinit { print("(name) is being deinitialized") }
    }
    class Apartment {
        let unit: String
        init(unit: String) { self.unit = unit }
    //    var tenant: Person?
    
        weak var tenant: Person? //弱引用
        deinit { print("Apartment (unit) is being deinitialized") }
    }
    
    class First_Demo2: UIViewController {
        
    //    var reference1: Person?
    //    var reference2: Person?
    //    var reference3: Person?
        
        var john: Person?
        var unit4A: Apartment?
        var johnnn: Customer?
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.navigationItem.title = "自动引用计数"
            self.view.backgroundColor = UIColor.white
            
    //        let person = Person(name:"wangyalu")
            
            //reference1 = Person(name: "John Appleseed")
            //John Appleseed is being initialized
    
            //在你清楚地表明不再使用这个 Person 实例,强引用被断开时,ARC 会销毁它:
    //        reference1 = nil
            
            
            //互为强引用
            john = Person(name:"wang")
            unit4A = Apartment(unit:"4A")
            
            // Person 实例现在有了一个指向 Apartment 实例的强引 用,而 Apartment 实例也有了一个指向 Person 实例的强引用。因此,当你断开 john 和 unit4A 变量所持有的强 引用时,引用计数并不会降为 0 ,实例也不会被 ARC 销毁:
    
            john!.apartment = unit4A
            unit4A!.tenant = john
            
           //当你把这两个变量设为 nil 时,没有任何一个析构函数被调用。循环强引用会一直阻止 Person 和 Apartme nt 类实例的销毁,这就在你的应用程序中造成了内存泄漏。
            john = nil
            unit4A = nil
            
            //注意:
            /*在使用垃圾收 的系统里,弱指针有时用来实现简单的缓冲机制,因为没有强引用的对象只会在内存压力触发垃 圾收 时才被销毁。但是在 ARC 中,一旦值的最后一个强引用被移除,就会被立即销毁,这导致弱引用并不适 合上面的用途。*/
            
            johnnn = Customer(name: "John Appleseed")
            johnnn!.card = CreditCard(number: 1234_5678_9012_3456, customer: johnnn!)
            johnnn = nil
            // 打印 “John Appleseed is being deinitialized”
            // 打印 ”Card #1234567890123456 is being deinitialized”
        }
        
        /*
         Customer 实例持有对 CreditCard 实例的强引用,而 CreditCard 实例持有对 Customer 实例的无主引用。 由于 customer 的无主引用,当你断开 johnnn 变量持有的强引用时,再也没有指向 Customer 实例的强引用了:
         由于再也没有指向 Customer 实例的强引用,该实例被销毁了。其后,再也没有指向 CreditCard 实例的强引 用,该实例也随之被销毁了:
         */
        
        class Customer {
            let name: String
            var card: CreditCard?
            init(name: String) {
                self.name = name
            }
            deinit { print("(name) is being deinitialized") }
        }
        class CreditCard {
            let number: UInt64
            unowned let customer: Customer
            init(number: UInt64, customer: Customer) {
                self.number = number
                self.customer = customer
            }
            deinit { print("Card #(number) is being deinitialized") }
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    }
    
     
  • 相关阅读:
    Linux命令: ls -l显示文件和目录的详细资料
    Linux命令: ls -F
    Linux命令: pwd显示工作路径
    Linux命令: cd /home 进入'/home'目录
    Linux命令: cd ../.. 返回上两级目录
    Linux命令: cd
    boost::mpl::eval_if的使用方法
    【block第四篇】实现
    Android中pendingIntent的深入理解
    hdu 1565 方格取数(1)(状态压缩dp)
  • 原文地址:https://www.cnblogs.com/sayimba/p/6237240.html
Copyright © 2011-2022 走看看