ios-oc(基本语法4-内存管理)

时间:2014-05-23 12:03:27   收藏:0   阅读:347

内存管理

bubuko.com,布布扣 

重写dealloc方法

bubuko.com,布布扣
@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;  
}
bubuko.com,布布扣

 

代码中可以通过 用指针调用retainCount方法来获得对象计数器的值。

bubuko.com,布布扣

成员变量的内存管理(如果成员变量是对象,才需要管理)

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

ios-oc(基本语法4-内存管理),布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!