变量类型

138 阅读4分钟

iOS变成中的变量相信大家都不陌生

变量类型分类有很多种 一般都是按照存储位置来定的

在栈中存储的变量 是位于函数内部的 作用范围也仅仅是在函数内部而已

- (void)function {

int a = 3;

}

int a = 3; 其实系统是做了两部操作的  划分一块大小容量为int容量的区域 并切命名为a 以方便在以后使用的 另一步操作是将该区域的电位调整为表示3的二进制电位准确来说就是这样的(in t为4个字节)

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011

内存中是这样的 这一块内存地址其实地址由a代表 依旧是实用a就可以找到这块内存进而找到这块内存中的值 像这样的数据 即表示代表内存地址并且值也存储在分配内存地址里面的这种变量属于值类型数据(索引地址和存储地址位于栈中的叫值类型数据)

========================

- (void)function {

NSObject * obj = [NSObject new];

}

这种的话 先会在栈内存中开辟一块存储对象指针类型的空间并切命名为obj 然后在堆中开拍一块存储NSObject这种类型大小的内存空间 开辟完成之后会将堆中内存首地址赋值给obj obj就可以过存储的地址找到正真存放数据的位置 进制获取数据 obj变量的生命周期是在function函数内部有效的 所以当 函数执行完毕后 obj由栈自动回首掉 不用程序员管理 [NSObject new]位于堆中的内存 发现 没有指向自己的指针存在时 引用计数就会-1变成0然后就背释放掉 这种就属于址类型数据(索引地址位于栈存储地址位于堆这种叫址类型数据)

========================

当然不仅仅只有这两种

堆中内存会优先于最大生命周期的变量保持一致(强类型不包括弱类型)

@property (nonatomic, strong) NSObject * strongObj;

- (void)function {

NSObject * obj0 = [NSObject new];

self.strongObj = obj0;

}

此时[NSObject new]的生命周期会优先于self.obj保持一致 self.obj又回于它所属的类生命周期保持一致

========================

@property (nonatomic, weak) NSObject * weakObj;

- (void)function {

NSObject * obj0 = [NSObject new];

self.weakObj = obj0;

}

此时[NSObject new]的生命周期依然时该函数内部有效

========================

NSObject * _obj;

- (void)function {

NSObject * obj0 = [NSObject new];

_obj = obj0;

}

实例变量根属性是一支的 实例变量都会于本类生命周期保持一致

实例变量的修饰符@private @protected @public @package是用来限定实例变量的作用范围的 

========================

静态变量

static修饰的变量 只会初始化一次 

- (void)function {

static int a = 0;

a ++;

NSLog(@"%d", a);

}

多次调用时 a的值会一直增加下去 但是本类释放掉的时候a也不会释放 

这种就叫局部静态变量 

========================

static int a = 0;

- (void)function {

a ++;

NSLog(@"%d", a);

}

这种叫全局静态变量 会与程序生命周期保持一致


以上是本人的总结 如有错误 还请斧正


补充:

1、静态变量 static

什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用static。

静态变量的优点:

1、节省内存。静态变量只存储一处,但供所有对象使用。

2、它的值是可以更新的。

3、可提高时间效率。只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。

2、全局变量extern

什么是全局变量:也称之为外部变量,是在方法外部定义的变量。它不属于哪个方法,而是属于整个源程序。

作用域是整个源程序。

如果全局便利和局部变量重名,则在局部变量作用域内,全局变量被屏蔽,不起作用。编程时候尽量不使用全局变量。

3、局部变量

什么是局部变量:是在方法内作定义说明的。其作用域仅限于方法内。

iOS中外部变量只能是编译时的常量(字符串, 基本数据类型)

4、实例变量

在类中定义的实例变量,是可以在各个方法内使用的。

5、const

变量值不可变

6、volatile

表示变量随时可以改变