内存管理范围和@property
2016-03-19 17:39
309 查看
管理范围:
管理任何继承NSObject的对象,对其他的基本数据类型无 效
本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于 栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指 向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄 露。
![](webkit-fake-url://CF41E4FE-6A36-4AA5-8DF4-5630D3124AB0/page8image376.png)
内存管理的原则
1)原则
只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让对象的引用计数器-1;
2)谁创建,谁release
(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者 autorelease方法
(2)不是你创建的就不用你去负责
3)谁retain,谁release
只要你调用了retain,无论这个对象时如何生成的,你都要调用release
4)总结
有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.
:
1)空指针:没有指向任何东西的指针,给空指针发送消息不会报错 关于nil和Nil及NULL的区别:
nil: A null pointer to an Objective-C object. ( #define nil ((id)0) ) nil 是一个对象值。
Nil: A null pointer to an Objective-C class.
NULL: A null pointer to anything else. ( #define NULL ((void *)0) ) NULL是一个通用指针(泛型指针)。
NSNull: A class defines a singleton object used to represent null values in collection objects (which don't allow nil values).
[NSNull null]: The singleton instance of NSNull.
[NSNull null]是一个对象,他用在不能使用nil的场合。
@property
@property int age; 1)生成一个_age 2)生成get和set方法的声明 3)生成 get和set方法的实现
@property (......) int age;
![](webkit-fake-url://CF41E4FE-6A36-4AA5-8DF4-5630D3124AB0/page35image4472.png)
1)内存管理相关参数
retain:对对象release旧值,retain新值(适用于OC对象类型) assign:直接赋值(默认,适用于非oc对象类型) copy:release旧值,copy新值
验证assign如果作用在对象上,实际上就是直接赋值 //使用@property增强型 生成get和set方法
@property(nonatomic,assign)Car *car; /*
.m文件中实际上生成的是
_car = car; //当对象release后,将无法使用该对象
*/
![](webkit-fake-url://CF41E4FE-6A36-4AA5-8DF4-5630D3124AB0/page36image5672.png)
@property 参数(二)
1)是否要生成set方法(若为只读属性,则不生成)
readonly:只读,只会生成getter的声明和实现 readwrite:默认的,同时生成setter和getter的声明和实现
2)多线程管理(苹果在一定程度上屏蔽了多线程操作)
nonatomic:高性能,一般使用这个 atomic:低性能,默认
3)set和get方法的名称
修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用 在布尔类型中的getter。
@property(nonatomic,assign, setter=abc:,getter=haha)int age 可以理解为把[psetAge:]------>[pabc:], [page] --------->[phaha];
@property(nonatomic,assign, setter=setVip:,getter=isVip) BOOL vip;
管理任何继承NSObject的对象,对其他的基本数据类型无 效
本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于 栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指 向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄 露。
![](webkit-fake-url://CF41E4FE-6A36-4AA5-8DF4-5630D3124AB0/page8image376.png)
内存管理的原则
1)原则
只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让对象的引用计数器-1;
2)谁创建,谁release
(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者 autorelease方法
(2)不是你创建的就不用你去负责
3)谁retain,谁release
只要你调用了retain,无论这个对象时如何生成的,你都要调用release
4)总结
有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.
:
1)空指针:没有指向任何东西的指针,给空指针发送消息不会报错 关于nil和Nil及NULL的区别:
nil: A null pointer to an Objective-C object. ( #define nil ((id)0) ) nil 是一个对象值。
Nil: A null pointer to an Objective-C class.
NULL: A null pointer to anything else. ( #define NULL ((void *)0) ) NULL是一个通用指针(泛型指针)。
NSNull: A class defines a singleton object used to represent null values in collection objects (which don't allow nil values).
[NSNull null]: The singleton instance of NSNull.
[NSNull null]是一个对象,他用在不能使用nil的场合。
@property
@property int age; 1)生成一个_age 2)生成get和set方法的声明 3)生成 get和set方法的实现
@property (......) int age;
![](webkit-fake-url://CF41E4FE-6A36-4AA5-8DF4-5630D3124AB0/page35image4472.png)
1)内存管理相关参数
retain:对对象release旧值,retain新值(适用于OC对象类型) assign:直接赋值(默认,适用于非oc对象类型) copy:release旧值,copy新值
验证assign如果作用在对象上,实际上就是直接赋值 //使用@property增强型 生成get和set方法
@property(nonatomic,assign)Car *car; /*
.m文件中实际上生成的是
_car = car; //当对象release后,将无法使用该对象
*/
![](webkit-fake-url://CF41E4FE-6A36-4AA5-8DF4-5630D3124AB0/page36image5672.png)
@property 参数(二)
1)是否要生成set方法(若为只读属性,则不生成)
readonly:只读,只会生成getter的声明和实现 readwrite:默认的,同时生成setter和getter的声明和实现
2)多线程管理(苹果在一定程度上屏蔽了多线程操作)
nonatomic:高性能,一般使用这个 atomic:低性能,默认
3)set和get方法的名称
修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用 在布尔类型中的getter。
@property(nonatomic,assign, setter=abc:,getter=haha)int age 可以理解为把[psetAge:]------>[pabc:], [page] --------->[phaha];
@property(nonatomic,assign, setter=setVip:,getter=isVip) BOOL vip;
相关文章推荐
- solr5.3+tomcat-7.0.65+IKAnalyzer分词
- 英语歌曲:Can't Stop Love
- linux制作补丁包和打补丁——patch命令简记
- Linux内核分析——系统调用(上)
- 自动化运维集中式管理工具saltstack的基于各个平台的部署
- centos的常用基本命令
- Ubuntu12.04下Hadoop2.4源码编译安装
- rysnc详解以及rysnc后台服务配置
- OpenGL光照
- linux网口绑定笔记-bind
- Apache用户认证
- centos6.7安装xen
- docker Dockerfile生成镜像
- 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)
- tomcat启动指定jdk方法
- 数组操作pop push shift unshift的区别
- [Linux]centOS7下RPM安装Perl
- 使用popupwindow自定义一个服务评价
- openssl命令行-证书认证
- Lesson 8 几何渲染