iOS-变量从认识到理解

2017-12-12  本文已影响0人  树下敲代码的超人

技 术 文 章 / 超 人


变量:

  • 组成
    变量的作用就是存放标识值。变量由三部分组成,变量名,变量类型,变量值。举个简单的例子:“一个存放水的玻璃盒子叫X玻璃水盒”,存放水,意味着盒子中拥有的东西就是水即变量的值,而这个值是有特性的,根据它的特性而区分类型的即是变量类型,水不能放在纸盒子和木盒子中,因为会漏水,所以放在玻璃盒子中,因为玻璃盒子能完美的存放水,选择玻璃盒子的原因是因为值是水,值的特性决定了存放值的变量类型。而X玻璃水盒是这个盒子的名字即变量名,用四个字X玻璃水盒去形容或者说称呼它比用“一个存放水的玻璃盒子”要简洁方便而且更加针对性。变量名就是为了从文字和称呼上区分理解它的类型与值,规范的变量名要能体现变量值的意义和变量类型。
    例如:存放用户名的变量 NSString *userNameString = @“用户名”;
    变量值特性决定了变量的类型,变量名体现了变量值与变量类型的特性`

  • 指针(变量)
    指针中包含类型,指针地址,指针变量。
    例子:int a = 10; NSString * str = @“1234”;
    类型:a变量的类型是int类型,因为它没有 * 是基本数据类型。str指针的类型是指针类型,因为有*表示是指针
    指针地址:是储存指针或者变量所在内存中的地址,仅仅代表变量或者指针本身,而不能代表它们所指向的值。可以用&来获取指针地址,用%p来打印值,例如:NSString *string = @“123”;NSLog(@“%p”,&string);打印结果是0xea544280;打印出来的就是string的指针地址,它代表的仅仅是string这个变量名或者说指针。 跟“123”这个值无关。
    指针变量:是存储所在内存中的地址的一个可变量,把指针变量拆分为指针和变量,指针表示指针变量所储存的是一个指针地址,变量表示指针变量所存储的地址会发生改变,即指针变量中所储存的是变量值在内存中的地址,例如刚刚说所的@“123”。这个值是有单独的内存地址的。而变量中的指针变量就是记录这个值的地址。

NSString *string = @"123";
NSLog(@"指针变量的地址:%p",string);
NSLog(@"指针地址:%p",&string);
string = @"321";
NSLog(@"指针变量的地址:%p",string);
NSLog(@"指针地址:%p",&string);
string = @“123”;
NSLog(@"指针变量的地址:%p",string);
NSLog(@"指针地址:%p",&string);

打印结果

指针变量的地址:0x108767218
指针地址:0x7ffee7498b78
指针变量的地址:0x108767278
指针地址:0x7ffee7498b78
指针变量的地址:0x108767218
指针地址:0x7ffee7498b78

由此可以发现, 指针地址一直没有变,因为我们一直使用的都是string这个指针。而当改变string这个指针所指向的值时,string的指针变量地址就发生了改变。因为值不同了,值所在内存中的地址就不同了。具体原因呢就要说到栈区,堆区,全局区,文字常量区,代码区。


栈区,堆区,全局区,常量区,代码区,自由存储区(内存分析上说)

NSString *string1;//string1 这个NSString 类型的指针,未初始化存在于<全局区>的<BBS区>

NSString *string2 = @"1234";//string2 这个NSString类型的指针,已初始化存在与<全局区>的<data数据区>,@“1234”存在与堆区,因为@代表了对象。 

static NSString *string3;//string3 这个NSString 类型的指针存在于<全局区>的<BBS区>

static NSString *string4 = @"1234";//string4 这个NSString类型的指针存在与<全局区>的<data数据区>,@“1234”存在与堆区,因为@代表了对象。stiring2和string4的值地址是一样的

static const NSString *string5 = @"654321";//const 修饰后  string5不能修改值。 其他的与string4一样

- (void)test
{
int  a;//a这个int类型的变量 是存在与<栈区>的
a = 10;//10这个值是存在与 <常量区>的

NSStirng *str;//str这个NSString类型的指针 存在于<栈区>
str = @“1234”;//@“1234”这个@对象存在于 <堆区>

static NSString *str1;//str1这个NSString类型的指针 存在于<全局区>的<BBS区>
static NSString *str2 = @"4321';//str2这个NSString类型的指针 存在于<全局区>的<data区>

NSString *str3;//str3这个NSString类型的指针 存在于<栈区>
str3 = [[NSString alloc]initWithString:@"1234"];//[[NSString alloc]initWithString:@"1234"]这个对象 存在于<堆区>

}

static静态变量

静态变量有两种

static NSString *name;

extern全局变量
全局变量有两种

.m中要定义
NSString *name;

.h中同时要定义
extern NSString *name;

全局静态变量与全局变量 其实本质上是没有区别的,只是存在修饰区别,一个static让其只能内部使用,一个extern让其可以外部使用


const常量
不同于变量,常量的值是固定不可变的,一般用于只读值。
优点:只可以读取值,不能修改。一般用于接口或者文字显示这种固定值。添加extern可以对外全局常量,任意位置都可以访问
缺点:存在的生命周期长,从定义直到程序结束。需要在.h .m中分别定义代码较多
建议:看个人习惯吧,使用宏或者常量只是编译加载方式不一样而已

.h中定义extern
extern NSString *const name;
.m中定义值
NSString *const name = @"123";

未完待续。。。

上一篇 下一篇

猜你喜欢

热点阅读