admin 管理员组文章数量: 887021
object
和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等。
本文标签: object
版权声明:本文标题:object 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687208997h76443.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论