object-c中的对象的释放

和C++不同的是,object-c中并没有规定说一定要实现一个构造函数和析构函数;所以,在object-c中,其实没有构造函数和析构函数这样的概念,取而代之的应该是对象的创造和初始化,对象的释放。与对象的释放相关的关键字,最基本的有dealloc,release, autorelease,用它们就可以进行对象的释放。实例代码如下:

1. 定义ClassA如下

#import <Foundation/Foundation.h>  

 
@interface ClassA : NSObject
{
}
-(void) hello;
@end
 
@implementation ClassA
-(void) hello
{
NSLog(@"hello\n");
}


-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyed\n");
}
@end


void func()
{
NSLog(@"{ begin\n");
ClassA *obj1 = [[ClassA alloc] init];
ClassA *obj2 = obj1;
[obj1 hello];
[obj1 release];
[obj2 hello];          //  内存泄露
[obj2 release];

NSLog(@"} end\n");
}


int main(int argc, char**argv)  
{    
func();
return 0;
}  

2. 编译方法:

$ gcc -fconstant-string-class=NSConstantString -c memtest_realloc.m -I /GNUstep/System/Library/Headers
$ gcc -o memtest_realloc memtest_realloc.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
$ ./memtest_realloc

3. 运行结果:

2013-07-27 05:47:28.281 memtest_realloc[5484] { begin
2013-07-27 05:47:28.312 memtest_realloc[5484] hello
2013-07-27 05:47:28.328 memtest_realloc[5484] ClassA destroyed

并且抛出window窗口,应用程序错误,其实是内存泄露

4. 更多的测试例子如下:

   (1).用dealloc:

        [obj1 hello];
[obj1 dealloc];
[obj2 hello];
[obj2 release];

       运行结果:

       和上面的一样,也会出错

    (2)用autorelease:

       ClassA *obj1 = [[[ClassA alloc] init] autorelease]; 

       ClassA *obj2 = obj1; 

       [obj2 retain]; 

       [obj1 hello]; //输出hello

      //对于obj1,无需调用(实际上不能调用)release

      [obj2 hello]; //输出hello

      [obj2 release];

     运行结果:

     2013-07-27 06:06:19.750 memtest_realloc[4668] { begin
     2013-07-27 06:06:19.781 memtest_realloc[4668] autorelease called without pool fo
     r object (0xdf5480) of class ClassA in thread <NSThread: 0x520788>
     2013-07-27 06:06:19.781 memtest_realloc[4668] hello
     2013-07-27 06:06:19.796 memtest_realloc[4668] hello
     2013-07-27 06:06:19.796 memtest_realloc[4668] } end

     //成功

5.说明:

     关于对象如何释放,实质是对于内存如何管理的问题,object-c没有垃圾回收机制,所以,需要用户自己来管理对象,简单的原则是,是你创建的,你就要负责销毁;不是你创建的,不要去销毁;用好release,autorelease,retain,realloc等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值