//
// AccessMomory.swift
// SwiftCode
//
// Created by Alisa on 2022/4/15.
// Copyright © 2022 Alisa. All rights reserved.
//
import Foundation
/*
独占访问权限是Swift4中引入的一大新特性,很多开发者认为这是一种编译器的编译时特性,可以在数组越界时、对遍历中的数组删添元素时产生编译异常.
其实并非如此,独占内存访问权限特性是一种编译时和运行时的安全特性,其和数组也没有任何关系。
当两个变量访问同一块内存时,会产生独占内存访问权限
在Swift4以前,程序对内存的读写访问并没有严格控制,你在读内存时有写内存操作,或者在写内存时有读操作并不会产生什么异常。Swift4中则引入了
独占内存访问权限的特性,如果符合如下3个条件,则程序会产生读写权限冲突:
1> 至少有一个变量在使用写权限
2> 变量访问的是同一个内存地址
3> 持续时间有重叠
** inout 参数读写权限冲突
一般情况下,值类型的传参总会产生复制操作,inout参数则使得函数内可以直接修改外部变量的值。inout参数是最容易产生读写冲突的场景
** 结构体中自修改函数的读写冲突
** 值类型中属性的读写访问权限冲突
在Swift语言中,像结构体、枚举和元组中都有属性的概念,由于其都是值类型,因此在对不同的属性进行访问时都会产生冲突
在开发过程中大部分对于不同属性的访问都不会产生读写冲突,对不同属性的访问需满足下面3个条件,才不会产生读写冲突:
1> 访问的是存储属性,而不是计算属性
2> 访问的是结构体局部变量(函数中的变量), 而不是全局变量