ios-oc(基本语法4-内存管理)
内存管理
重写dealloc方法
@implementation Dog #pragma mark 当一个对象从内存中移除的时候,就会被调用 - (void) dealloc { NSLog(@"----Dog被销毁了------"); //一定要调用super的方法,写在该方法的最后 [super dealloc]; } @end int main() { Dog *dog=[[Dog alloc] init]; [dog release];//回收对象内存,该行过后,dog变为了野指针(指向了不可用内存) dog =nil; [dog release]; //给空指针发消息,什么事也不发生 return 0; }
代码中可以通过 用指针调用retainCount方法来获得对象计数器的值。
成员变量的内存管理(如果成员变量是对象,才需要管理)
1、set方法的管理:*release就得成员变量,retain新的成员变量(需要对新旧成员变量是否相同进行判断)
2、delloc方法的管理:*release当前拥有的成员变量
二、@property参数
在@property后加上参数retain后,编译器即可自动生成含有内存管理的set与get方法的声明与定义。 格式:例:@property(retain) Cat *cat;
参数作用:
1、控制set方法的内存管理
1>retain: release旧值,ratain新值,对象成员必须为此类型。
2>assign(默认):直接赋值,不作任何内存管理
3>copy:
2、控制有没有set方法 和get方法
1>readwrite(默认):同时生成set方法和get方法。例:@property(retain,readwrite) Cat *cat;
2>readonly:只会生成get方法(即只能读取,不能赋值)
3、多线程管理
1>atomic(默认):性能低。
2>nonatomic:性能高
4、控制set方法和get方法的名称(即不使用默认方法名)
1>setter:设置set方法的名称,一定有个冒号
2>getter:设置get方法的名称
例;@property(nonatomic,assign,getter=getHeight,setter=setMyHeight:)int height;//则get方法名为getHeight,set方法名为setMyHeight:
三、autorelease
使用方法:Person *p=[[[Person alloc] init ] autorelease];
autorelease返回对象本身,作用:autorelease会将对象加到池子里去,但是计数器没有改变。注:在池子销毁(即@autoreleasepool结束)时,池子里所有的对象都将做一次release操作(注意并不一定释放,只是计数器减一),ios的池子是由系统自行创建与销毁(系统可能存在多个池子),也可以自己创建池子,所以具体池子的创建与销毁时间不确定,故应该尽量少用autorelease。
苹果官方提供的方法(API):
1>如果方法名不是alloc、new,就不用release或者autorelease,
2>若方法名是 alloc、new,就必须release或者autorelease