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。
一个进程在内存中的布局:栈区,堆区,.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。
相关文章推荐
- OpenCv里的一些基本函数,持续更新中。。。。。
- web响应式布局一些基本css 持续更新
- 一些零碎的东西【持续更新】
- Monorail的一些常用的东西(验证码,分页。。。持续更新)
- 无聊时,看的一些关于java东西(持续更新)
- 编写巡检工具中一些shell基本技巧(持续更新)
- 思考一些基本概念(持续更新中)
- 一些很基本的小知识点,这篇作为持续更新用的
- [置顶] 对知识的一些理解<持续更新中>
- 一些应该记住的东西(持续更新?)
- css使用中新发现了一些有意思的东西,持续更新
- java 关于使用java1.8的localDateTime日期操作的基本使用以及一些使用技巧 持续更新...
- 【持续更新】总结:C++开发时积累的一些零碎的东西
- OpenCv里的一些基本函数,持续更新中。。。。。
- 『C#基础』一些零碎东西的记录(持续更新)
- 6-用过一些JS-Tree控件之后的总结【将持续更新】
- This关键字的一些更新的理解
- 推荐一些软件(持续更新)
- Eclipse 基本设置【持续更新】
- 作为前端,个人整理的一些网站链接(持续更新中)