内存管理

内存管理:
一、属性的内存管理方式:其实就是手动生成set和get方法:必须了解set和get方法中的实现原理

二、初始化的内存管理方式
_name = name不能这样写,只能写成self.name,要不会形成野指针
三、便利构造器的内存管理方式
return [stu autorelease];//便利构造器的内存管理只在返回值这块延迟释放就行,所以在使用便利构造器创建对象时就不需要释放了,因为在类的内部调用你一次便利构造器方法就会走释放这块

pragma mark 属性的三大特性

/**
 *第一类:读写控制
 readonly:只生成get 方法
 reawrite:生成get和set方法
 set:用来指定生成的set方法名字
 get:用来指定生成的get方法名字
 *
 */

手动生成set和get方法必须实现这个方法,否则无法实行 @synthesize name = _name,age = _age,sex= _sex, score = _score,hobby=_hobby;

/**
 *第二类:原子性控制
 atomic:原子安全设置,在多线程环境中,一次只能由一条线程访问,默认是安全性设置。但是这种设置会降低程序的性能,一般不考虑
 nonatomic:非原子安全设置:set、get方法中,并不像atomic一样添加线程安全控制代码,而是普通的set、get方法。这种设置可以大大提高程序的性能,但是在多线程环境中,需要考虑线程安全问题。
*
 */

/**
 *第三类:语义设置
 assign :使用 assign 声明的属性对应的实例变量存储器方法的实现,是在方法里直接赋值、取值、并没有操作内存的引用计数。一般用来将基本数据类型的属性特征声明为 assign ,使用assign修饰的对象不用进行内存管理。所以不必释放,因为assign类型是存在栈区的,只有堆区的东西才需要内存管理
 retain:使用 retain 声明的属性对应的实例变量存储器方法的实现,内部会做内存优化处理,修改对象的引用计数
 copy:使用 copy 声明的属性对应的实例变量存储器方法的实现,内部也会做内存优化处理,将对象拷贝一份,然后修改新对象的引用计数(区分深拷贝和浅拷贝)

 *一般情况下,将OC中的对象声明为retain或copy特征
     assign是修饰基本类型
 */

assign和weak的区别
weak释放完之后会把对象置为nil,

你可能感兴趣的:(内存管理)