您的位置:首页 > 其它

OC一些基本东西的理解(持续更新)

2017-04-04 17:58 274 查看
1> 关于static的理解

一个进程在内存中的布局:栈区,堆区,.data段,.bss段,.text段。栈区,一般函数体内的局部变量(除了动态分配的),都是分配在栈区的。堆区,就是通过alloc等方式生成的对象存储区,.text段保存进程执行的二进制文件,.data段存放的是进程所有已初始化的全局变量,.bss段存放的是进程未初始化的全局变量(.data和 .bss的生命周期是和整个程序一样的)

1.static  修饰全局变量的时候,是将变量放在了.data段,并且指明只能在这个源文件中使用。

2.static 修饰局部变量的时候(比如某个函数体内的局部变量),也是将变量放在.data段,它的作用域仅限于这个函数内。

3.static 修饰函数的时候,也是表明这个函数只能在这个源文件中使用。类似private。

2> 关于字面量字符串的一些知识

类似这样的NSString * str1 = @"mushao";就是通过字面量创建的字符串。这个“mushao”存储在常量存储区,如果通过字面量创建str2,比如NSString * str2 = @“mushao”;,那么指针str1和str2指向的都是“mushao”这一个东西。常量存储区和程序的生命周期一样。

3> 关于OC中对属性的修饰词

assign   一般用来修饰基本数据类型,表示值引用(它也可以修饰对象类型,但是容易造成野指针,不安全,有造成崩溃的可能。因此修饰对象类型的时候,请尽量不用这个)

weak   弱引用,用来修饰对象类型。表示我只引用这个对象,不对这个对象保有持有权,如果这个对象释放了,指针会自动指向nil。使用起来非常安全。(OC中对nil发送消息不会有问题)

strong   表示强引用,用来修饰对象类型。对这个对象有持有权。一个对象被强引用后,就不会被释放。

copy   一般代码中常常都是用来修饰NSString等的。copy顾名思义拷贝,复制。arc中凡是被copy修饰的属性,它的set方法中,会对传过来的参数进行copy操作后才赋值给属性变量。比如:

@property(nonatomic,copy)NSString * name;

-(void)setName:(NSString *)name

{

_name = [name copy];

}

有些人在使用的过程中会觉得使用strong和copy对NSString来说没有什么区别,这是错误的。这里先说一下浅拷贝和深拷贝的知识。浅拷贝:只是复制了一个指针,指向同一个对象。深拷贝:复制了一个新的对象,同时使用一个指针指向这个新的对象。对不可变对象执行copy操作是浅拷贝,对象仍然是不可变的,对可变对象执行copy操作是深拷贝,返回的新对象是不可变的;对不可变对象和可变对象进行mutableCopy,都是深拷贝,返回的对象都是可变的。

上面对于NSString进行copy操作,毫无疑问是一个浅拷贝。这个时候使用strong和copy其实没有什么区别。

但是如果你是声明一个可变的字符串str3,然后执行self.name = str3。那这个时候如果使用的是strong,那就相当于使_name指向str3指向的对象,这样的话,通过str3改变字符串的话,_name因为指向的是同一个对象,_name指向的东西也会跟着变化,可能会影响我们的需求。如果是用copy修饰name,那这个时候就会进行深拷贝,str3指向的字符串发生改变的时候,不影响name。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: