和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-c中的对象的释放相关推荐

  1. C#中所有对象共同的基类是System.Object

    C#中所有对象共同的基类是System.Object 转载于:https://www.cnblogs.com/boke1/p/11057080.html

  2. java object取数据_java使用ObjectInputStream从文件中读取对象

    import java.io.EOFException; import java.io.FileInputStream; import java.io.FileNotFoundException; i ...

  3. JS 删除对象(Object)中的键值对

    JS 删除对象(Object)中的键值对 假设有以下对象 const person = {name: 'zhangsan',age: 25,gender: 'man' } 可使用以下语句删除年龄age ...

  4. ElasticSearch中含有Object类型和数组对象的查询

    场景: 在ES库中含有对象Object类型的数据,查找了好久也没有找到相关的查询方法,特此记录一下 需求: 根据tags中的参数gisq_request_id参数的值获取相关的文档数据. 创建索引: ...

  5. 转:C#中Monitor对象与Lock关键字的区别分析

    Monitor对象1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  6. Thread和Object类中关于线程的相关方法

    Thread和Object类中线程的7个重要方法概览 类 方法名称 简介 Thread sleep相关 相关表示sleep所有的重载方法,参数不同,实际作用大同小异 Thread join() 等待其 ...

  7. ORACLE Recyclebin管理及flashback recyclebin中的对象

    Flashback用于恢复用户误删除的对象(包括表,索引等), 不支持sys用户. system表空间下的对象,也不能从回收站里拿到. 故使用SYS 或者SYSTEM用户登陆时, show recyc ...

  8. 探究:如何判断Delphi中的对象指针是否可用

    2019独角兽企业重金招聘Python工程师标准>>> 近日,在网上看到有网友问曰:如何确定一个对象指针是否可用?也就是说,如何确定一个对象指针是否指向一个真正可用的对象实例?其实这 ...

  9. 在JavaScript中删除对象

    本文翻译自:Deleting Objects in JavaScript I'm a bit confused with JavaScript's delete operator. 我对JavaScr ...

最新文章

  1. 浅谈MySQL存储引擎-InnoDBMyISAM
  2. python中如何定义颜色_Python图像处理之颜色的定义与使用分析
  3. 计算机说课如何做课件ppt,《我的新工具——计算机》说课课件.ppt
  4. linux fedora14 u盘运行,用U盘安装Fedora的详细步骤
  5. 【风马一族_php】NO4_php基础知识
  6. 等差数列划分Python解法
  7. 使用Jersey来创建RESTful WebService
  8. [转载] 在Python中使用Matplotlib绘制常见图表
  9. 宇宙第一 IDE 发布新版了
  10. NVIDIA下载老版本驱动/CUDA/Video Codec SDK的链接
  11. android实现b站弹幕,B站弹幕库DanmakuFlameMaster源码浅析
  12. 中国游戏发展史V-02
  13. Python转Java程序(1)
  14. 开务正式加入中国信通院数据库应用创新实验室
  15. 相对路径和绝对路径及表示
  16. linux的lilo,深入Linux的LILO
  17. 因特尔Edison第2站--mraa下gpio
  18. Longhorn 云原生容器分布式存储 - Air Gap 安装
  19. 【编程实践】为了带你搞懂RPC,我们手写了一个RPC框架
  20. Centos7登陆颜色修改#PS1

热门文章

  1. USACO-The Castle
  2. 块级、内联、内联块级
  3. 网上能干啥副业?适合网上干的副业,副业兼职做什么好?
  4. 手把手教你设置Typora的图床-gitee
  5. 项目的战前、战中与战后
  6. PowerQuery的参数表格用法
  7. 电机控制中标幺的目的
  8. Python环境搭建-自用
  9. 博实转债上市价格预测
  10. C#与C/C++的交互