标签:
六. oc基础知识(内存管理下)
总结:内存管理代码规范
1。只要调用alloc那么就必须调用release;
2。set方法的代码部分
*基本数据类型直接赋值。
*如果是oc对象类型
- (void) setCar:(Car *)car
{
if(_car!=car)
{
[_car release];
_car=[Car retain];
}
}
3.dealloc 部分的代码规范
*一定要[super dealloc ]放在最后面。
*对self(当前)所拥有的其他对象做一次release操作
[_car release];
[super dealloc]l;
4.NSString *str=@"Jack" 这也是一个对象类型但是,它既没有用到alloc也没有用到retain随意不用对他进行release操作。
2.内存管理的相关参数:
*retain:适用于oc对象类型,引用计数器的值+1;
*assign:直接赋值(适用于普通数据类型)
*copy:release旧值retain新值。
*是否要生成set和get 方法
@property (readonly) int height;
这样就只会生成get方法而不产生set方法。
*readwrite 是可读可写类型,
*多线程管理
*nonatomic:当生成多线程代码的时候,不加锁(高性能)
*atomic:加锁,但是性能低下。
3.setter和getter方法的声明@property(getter=abc) int weight;
用来给set和get方法改名字的,这样就可以直接用abc方法来调用了
4.在非ARC下,用@property来声明变量,这样set方法release旧值,retain新值就不用自己写了,但是的dealloc,和主函数中的release还是省不了的。
5.在ARC形式时所有的retain,release。和retaincount,autoreleasepool都不能用了,所有的变量都用@property的形式声明就可以了。
6.当在非ARC时遇到release,如果引用计数器的值这时候正好变为0了,则立马跳到相应的dealloc方法中去,而不是执行完下面的代码才释放。
7.@class 的用法
@class 类名;仅仅告诉编译器这是一个类,下面可以创建Car累的对象,而不用担心由#import"Car.h",若是在Person类中用到car的对象,则在Person.m文件中再用#import”car.h“即可
总结:1.声明一个类仅仅是告诉编译器某个名称是一个类
2.开发中引用一个类的规范。
1>在.h文件中用@class来声明类
2>在.m文件中用#import引用进来就行了,这也避免了循环引用
3>两端循环引用的解决方案
1.一端用retain,一端用assign(用assign是就不用在dealloc中release因为用的就是assign计数器是不会+1的 )
8.@class @import的区别
如果有上百个头文件#import了同一个文件,或者是这些文件一次被#import,那么一旦最开头的文件稍有改动,后面引用到的那个文件的所有类都需要重新编译一遍,这样的效力也是可想而知的,而相对来讲使用@class方式就不会楚翔这种问题。
#import <Foundation/Foundation.h> @class Person; int main(int argc, const char * argv[]) { @autoreleasepool { Person *per=[[Person alloc] init]; } return 0; }
9.autorelease
autorelease 方法返回对象本身,可以取代release Person*per=[[[Person alloc] init] autorelease];
autorelease 会将对象放入到一个自动释放池中,当自动释放池被销毁时,会对池子里的所有对象做一次release操作(并不是池子被销毁则对象一定被销毁),只是引用计数器的值减去1而已。
1 #import <Foundation/Foundation.h> 2 @class Person; 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool {//从大括号开始代表创建了一个池子 5 6 Person *per=[[[Person alloc] init] autorelease]; 7 8 }//到大括号结束代表池子被销毁了。 9 10 return 0; 11 }
这个池子是以站的形式存在的(先进后出) ,池子是可以被创建无数多个的,缺点是:延迟了对象的释放时间,优点是不用再操心release。不必在担心野指针错误了。同时不能精确的控制对象的销毁时间了,对于大对象不要用autorelease。
标签:
原文地址:http://www.cnblogs.com/keeganlee/p/4307708.html