欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

swift

程序员文章站 2022-04-11 17:05:46
...

一、值类型和引用类型

1:值类型(Value types)

每个实例都保留一份独有的数据拷贝,一般以结构体 (struct) 、 枚举(enum) 或者元组(tuple)的形式出现。如下OBAnimal的结构体

typedef struct {
    NSString *name;
}OBAnimal;

int main(int argc, char * argv[]) {
    OBAnimal ani1;
    ani1.name = @"ob";
    NSLog(@"%p:%@",&ani1,ani1.name);
    
    OBAnimal ani2 = ani1;
    ani1.name = @"newOB";
    NSLog(@"%p:%@",&ani1,ani1.name);
    NSLog(@"%p:%@",&ani2,ani2.name);
    return 0;
}

//打印如下
2020-08-13 14:55:12.980223+0800 ani1=0x7ffee7d2af08:ob
2020-08-13 14:55:12.980709+0800 ani1=0x7ffee7d2af08:newOB
2020-08-13 14:55:12.980785+0800 ani2=0x7ffee7d2af00:ob

OBAnimal ani2 = ani1;时,系统将会创建一个新的实例并将ani1中的值拷贝一份,赋值给ani2,所以修改ani1中的nameani2不会改变;ani2ani1是两个内存的值

2:引用类型(Reference types)

每个实例共享一份数据来源,一般以类(class)的形式出现。

如果上面的OBAnimal是一个类,那么修改其中任意一个实例的name属性。那么另一个也会改变。
因为OBAnimal *ani2 = ani1;操作时,堆上只有一个实例对象,ani2ani1是两个指向这个实例对象的指针。

引用类型和值类型区别

  1. 类是引用类型, 结构体为值类型
  2. 结构体不可以继承
  3. 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝
  4. 引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝

二、 mutating关键字

类是引用类型,而结构和枚举是值类型。

默认情况下,不能在其实例方法中修改值类型的属性。为了修改值类型的属性,必须在实例方法中使用mutating关键字。

使用此关键字,方法将能够更改属性的值,并在方法实现结束时将其写回到原始结构

swift
所以要改成mutating

struct Person {
    var name = "ob";
    mutating func test(_ newName: String) {
        self.name = newName;
        print(self.name);
    }
};
var tom = Person.init(); //这里就不能用let了,因为值改变了
tom.test("lsy");

//打印如下
lsy

三、strong、weak、 unowned

Swift 的内存管理机制与 Objective-C一样。

只有引用类型变量所引用的对象才需要使用引用计数器进行管理,对于枚举、结构体等,他们都是值类型的。因此不需要使用引用计数进行管理。

1:strong

strong 代表着强引用,是默认属性。不用写关键字strong

let cat = Animal.init();

2:weak

weak代表着弱引用。当对象被声明为 weak 时,该对象的引用计数不会增加1。它在对象释放后弱引用也随即消失。继续访问该对象,程序会得到 nil,不会崩溃

weak var cat = Animal.init();

因为对象释放时:需要对cat指针进行cat = nil操作,所以这里只能用var可变类型

3:unowned

unowned 与弱引用本质上一样。唯一不同的是,对象在释放后,依然有一个无效的引用指向对象,它不是 Optional 也不指向 nil。如果继续访问该对象,程序就会崩溃。和oc的__unsafe_unreturned一样

    unowned var cat = Animal.init();
    print(cat as Any); //发生崩溃

weak 和 unowned 的引入是为了解决由 strong 带来的循环引用问题。weak安全性高