内存管理:
一、属性的内存管理方式:其实就是手动生成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,