Objective-C Memory Management    Being Exceptional  异常处理与内存

3.1Cocoa requires that all exceptions must be of type NSException

cocoa 需要所有的异常是NSException类型的。

so even though you can throw an exception from other objects, Cocoa isn't set up to deal with those.

所以你即使从别的类抛出异常,cocoa 也不会处理。

 

Exception handling is really intended for errors that are generated by your programs. Cocoa frameworks usually handle errors by exiting the program, which is not what you want. You should throw and catch exceptions in your code, instead of letting them escape to the framework level.

cocoa框架通常用已经存在的程序解决异常。你应该throw and catch exceptions  在你自己的代码中,而不是任其跑到框架层。

To enable support for exceptions, make sure the -fobj-exceptions flag is turned on.

为了支持异常,你应该确保-fobj-exceptions打开。

When an exception is thrown and is not caught, the program stops at the exception point and propagates the exception.

当一个异常抛出后,并没有被接到的话,则程序停在异常点。

 

3.2  Keywords for exceptions 

All the keywords for exceptions start with @. Here's what each one does

所以的异常keyword 均以@开头。

(1)@try: Defines a block of code that will be tested to determine if an exception

should be thrown.

测试一个异常是否应该被抛出。

(2)@catch(): Defines a block of code for handling a thrown exception. Takes an

argument, typically of type NSException, but can be of other types.

处理异常

(3)@finally: Defines a block of code that gets executed whether an exception is

thrown or not. This code will always be executed.

不管是否抛出异常都运行。

(4)@throw: Throws an exception.

抛出异常

3.3 Catching Different types of exceptions 

You can have multiple @catch blocks depending on which type of exception you want to handle.

可以根据exception 的类型来选择@catch 的类型

@try{

} @catch (MyCustomException *custom) {

} @catch (NSException *exception) {

} @catch (id value) {

} @finally {

}

 

A program throws an exception by creating an instance of NSException and using one of two techniques:

一个程序抛出异常通过创建NSException 和使用下面的技术:

(1)Using @throw exception;

(2)Sending a raise message to an NSException objectwe'll create an exception: 我们建一个NSExcepiton 

NSException *theException = [NSException exceptionWithName: ...];

We can then throw with either 我们throw 通过下面:

@throw theException;

or

[theException raise];

You'll usually throw exceptions from inside the exception handling code.

也可以在一个exception handling code里再抛出异常。

@try {

    NSException *e = ...;

@throw e; }

  @catch (NSException *e) {

     @throw; // rethrows e.

}

2.4 Exceptions need memory management too . 异常也需要内存管理

 

Memory management can be tricky when exceptions are involved.

- (void)mySimpleMethod

{

    NSDictionary *dictionary = [[NSDictionary alloc] initWith....];

    [self processDictionary:dictionary];

    [dictionary release];

}

let's imagine that processDictionary throws an exception. The program jumps out of this method and looks for an exception handler. But because the method exits at this point, the dictionary object is not released, and we have a memory leak.

假如processDictionary 抛出异常,但是dictionary 还没有释放,因此有了memory leaks .

解决办法:One simple way to handle this is to use @try and @finally, doing some cleanup in @finally because it's always executed (as we said earlier).

在@finally 处处理,因为总是执行。

- (void)mySimpleMethod

{

    NSDictionary *dictionary = [[NSDictionary alloc] initWith....];

    @try {

     [self processDictionary:dictionary];

    }

    @finally {

    [dictionary release];

    }

}

 

2.5 Exceptions and autorelease pools   异常和自动释放池

Exceptions are almost always created as autoreleased objects because you don't know when they will need to be released. When the autorelease pool is destroyed, all objects in that pool are destroyed also, including the exception.

Exceptions 几乎总是被创作为自动释放因为你不知道什么时候结束。

 

  - (void)myMethod

{

  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSDictionary *myDictionary =

    [[NSDictionary alloc] initWithObjectsAndKeys:@"asdfads", nil];

  @try {

    [self processDictionary:myDictionary];

  } @catch (NSException *e) {

    @throw;

  } @finally {

    [pool release];

  }

}

There's a problem when we think about exception handling. We discussed earlier that we can rethrow exceptions in the @catch block, which causes the @finally block to execute before the exception is rethrown.

我们可以rethrow exceptions 在@catch block中。这导致了@finally在异常抛出前执行。

This will cause the local pool to be released before the exception can be delivered, thus turning it into a dreaded zombie exception.

这将导致恐怖的zombie exception.

- (void)myMethod

{

  id savedException = nil;

  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSDictionary *myDictionary =

    [[NSDictionary alloc] initWithObjectsAndKeys:@"asdfads", nil];

  @try {

        [self processDictionary:myDictionary];

  } @catch (NSException *e) {

       savedException = [e retain];

       @throw;

  } @finally {

       [pool release];

       [savedException autorelease];

  }

}

By using retain, we saved the exception in the parent pool. When our pool is released, we already have a pointer saved, and when the parent pool is released, the exception will be released with it.

通过retain ,我们保留了这个exception 在parent pool。

 

 

 

 

 

Objective-C Memory Management Being Exceptional 异常处理与内存的更多相关文章

  1. Objective -C Memory Management 内存管理 第一部分

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  2. [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory- ...

  3. Memory Management in Open Cascade

    Open Cascade中的内存管理 Memory Management in Open Cascade eryar@163.com 一.C++中的内存管理 Memory Management in ...

  4. Java (JVM) Memory Model – Memory Management in Java

    原文地址:http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java Understanding JV ...

  5. Objective-C Memory Management

    Objective-C Memory Management Using Reference Counting 每一个从NSObject派生的对象都继承了对应的内存管理的行为.这些类的内部存在一个称为r ...

  6. Operating System Memory Management、Page Fault Exception、Cache Replacement Strategy Learning、LRU Algorithm

    目录 . 引言 . 页表 . 结构化内存管理 . 物理内存的管理 . SLAB分配器 . 处理器高速缓存和TLB控制 . 内存管理的概念 . 内存覆盖与内存交换 . 内存连续分配管理方式 . 内存非连 ...

  7. Android内存管理(2)HUNTING YOUR LEAKS: MEMORY MANAGEMENT IN ANDROID PART 2

    from: http://www.raizlabs.com/dev/2014/04/hunting-your-leaks-memory-management-in-android-part-2-of- ...

  8. Android内存管理(1)WRANGLING DALVIK: MEMORY MANAGEMENT IN ANDROID PART 1

    from : http://www.raizlabs.com/dev/2014/03/wrangling-dalvik-memory-management-in-android-part-1-of-2 ...

  9. Understanding Memory Management(2)

    Understanding Memory Management Memory management is the process of allocating new objects and remov ...

随机推荐

  1. 点滴记录——Ubuntu 14.04中Chrome浏览器标题栏出现中文乱码

    今天不知道在系统里装的哪个软件与Chrome浏览器所用的字体向冲突了,导致标题栏显示的中文都变成了乱码,其次收藏栏中的中文也变成了乱码.导致原有的收藏内容都无法辨认了.在网上搜索了一下,也有人遇到了相 ...

  2. 2015/12/25 ① 图灵测试 ② 安装jdk出现的问题 ③ 配置环境变量

    ①图灵测试 1,解释 图灵测试一词来源于计算机科学和密码学的先驱阿兰·麦席森·图灵写于1950年的一篇论文<计算机器与智能>.阿兰·麦席森·图灵1950年设计出这个测试,其内容是,如果电脑 ...

  3. HDU1281 棋盘游戏 —— 二分图最大匹配 + 枚举

    题目链接:https://vjudge.net/problem/HDU-1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  4. 配置RabbitMQ远程访问

    本文参考自:http://flashing.iteye.com/blog/1797531 1.如果远程客户端网络状况不是太好,比如adsl什么的,那么一定在客户端打开requstedHeartbeat ...

  5. lucene DocValues——本质是为通过docID查找某field的值

    什么是docValues? docValues是一种记录doc字段值的一种形式,在例如在结果排序和统计Facet查询时,需要通过docid取字段值的场景下是非常高效的. 为什么要使用docValues ...

  6. Activity并行网关和排他网关

    说一说activiti中的排他网关和并行网关 activiti工作流中我们经常用到的网关有两种: 1. Exclusive Gateway 排他网关 排他网关.png 排他网关(也叫异或(XOR)网关 ...

  7. 【转】Echarts的使用以及动态加载数据

    一.Echarts的介绍 ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新 ...

  8. repo+manifests+git方式管理安卓代码

    repo+manifests+git方式管理安卓代码 1.repo的获取 repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是 ...

  9. c++性能测试工具:google benchmark入门(二)

    上一篇中我们初步体验了google benchmark的使用,在本文中我们将更进一步深入了解google benchmark的常用方法. 本文索引 向测试用例传递参数 简化多个类似测试用例的生成 使用 ...

  10. UI:网络请求

    JSON 外层是一个数组或者字典 富文本(相对来说比较安全).超文本,https安全超文本协议 NSURL NSURL *url = [[NSURL alloc]initWithString:@&qu ...