object-c中的对象的释放

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

1. 定义ClassA如下

#import  

 
@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
     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等。

你可能感兴趣的:(Object-C/Iphone)