从 C++ 到 Objective-C:异常处理和多线程

   2023-02-09 学习力0
核心提示:http://www.devbean.info/2011/04/from_cpp_to_objc_17/异常处理比起 C++ 来,Objective-C 中的异常处理更像 Java,这主要是因为 Objective-C 有一个 @finally 关键字。Java 中也有一个类似的 finally 关键字,但 C++ 中则没有。finally 是 try()…catch() 块

http://www.devbean.info/2011/04/from_cpp_to_objc_17/

异常处理

比起 C++ 来,Objective-C 中的异常处理更像 Java,这主要是因为 Objective-C 有一个 @finally 关键字。Java 中也有一个类似的 finally 关键字,但 C++ 中则没有。finally 是 try()…catch() 块的一个可选附加块,其中的代码是必须执行的,不管有没有捕获到异常。这种设计可以很方便地写出简短干净的代码,比如资源释放等。除此之外,Objective-C 中的 @try…@catch…@finally 是很经典的设计,同大多数语言没有什么区别。但是,不同于 C++ 的还有一点,Objective-C 只有对象可以被抛除。

不带 finally 带有 finally
BOOL problem = YES;
@try {
    dangerousAction();
    problem = NO;
} @catch (MyException* e) {
    doSomething();
    cleanup();
} @catch (NSException* e) {
    doSomethingElse();
    cleanup();
    // 重新抛出异常
    @throw
}
if (!problem)
    cleanup();
@try {
    dangerousAction();
} @catch (MyException* e) {
    doSomething();
} @catch (NSException* e) {
    doSomethingElse();
    @throw // 重新抛出异常
} @finally {
    cleanup();
}

严格说来,@finally 不是必要的,但是确实是处理异常强有力的工具。正如前面的例子所示,我们也可以在 @catch 中将异常重新抛出。事实上,@finally 在 @try 块运行结束之后才会执行。对此我们将在下面进行解释。

int f(void)
{
    printf("f: 1-you see me\n");
    // 注意看输出的字符串,体会异常处理流程
    @throw [NSException exceptionWithName:@"panic"
                                   reason:@"you don’t really want to known"
                                 userInfo:nil];
    printf("f: 2-you never see me\n");
}
 
int g(void)
{
    printf("g: 1-you see me\n");
    @try {
        f();
        printf("g: 2-you do not see me (in this example)\n");
    } @catch(NSException* e) {
        printf("g: 3-you see me\n");
        @throw;
        printf("g: 4-you never see me\n");
    } @finally {
        printf("g: 5-you see me\n");
    }
    printf("g: 6-you do not see me (in this example)\n");
}

最后一点,C++ 的 catch(…) 可以捕获任意值,但是 Objective-C 中是不可以的。事实上,只有对象可以被抛出,也就是说,我们可以始终使用 id 捕获异常。

另外注意,Cocoa 中有一个 NSException 类,推荐使用此类作为一切异常类的父类。因此,catch(NSException *e) 相当于 C++ 的 catch(…)。

多线程

线程安全

在Objective-C 中可以很清晰地使用 POSIX APIs 2 实现多线程。Cocoa 提供了自己的类管理多线程。有一点是需要注意的:多个线程同时访问同一个内存区域时,可能会导致不可预料的结果。POSIX APIs 和 Cocoa 都提供了锁和互斥对象。Objective-C 提供了一个关键字 @synchronized,与 Java 的同名关键字是一样的。

@synchronized

由 @synchronized(…) 包围的块会自动加锁,保证一次只有一个线程使用。在处理并发时,这并不是最好的解决方案,但却是对大多数关键块的最简单、最轻量、最方便的解决方案。@synchonized 要求使用一个对象作为参数(可以是任何对象,比如 self),将这个对象作为锁使用。

@implementation MyClass
 
-(void) criticalMethod:(id) anObject {
    @synchronized(self) {
        // 这段代码对其他 @synchronized(self) 都是互斥的
        // self 是同一个对象
    }
    @synchronized(anObject) {
        // 这段代码对其他 @synchronized(anObject) 都是互斥的
        // anObject 是同一个对象
    }
}
@end
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 《黑马程序员》 category分类的使用(Objective
    分类的作用:在不改变原来类的基础上,可以给类增加一些方法。使用注意 : ①  分类只能增加方法,不可以增加成员变量                ②  分类的方法在实现中可以访问成员变量,不过成员变量必须手动实现。               
    03-16
  • Objective-C学习—UIScrollView控件使用
    Objective-C学习—UIScrollView控件使用
    一、知识点简单介绍1.UIScrollView控件是什么?(1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限(2)当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容(3)普通的UIView不具备滚动功能
    03-16
  • Objective-C Runtime(转)
    博主地址: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话
    03-08
  • iOS扩展——Objective-C开发编程规范 简单io扩展实验代码
    iOS扩展——Objective-C开发编程规范 简单io扩
      最近准备开始系统学习一个完整项目的开发流程和思路,在此之前,我们需要对iOS的开发变成规范进行更系统和详尽的学习,随意对编程规范进行了整理和学习。本文内容主要转载自:Objective-C-Coding-Guidelines-In-Chinese  此外,这篇文章所说的一些常见
    03-08
  • Objective-C利用协议实现回调函数
    实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下:  实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate //回调函数 -(void)messageCallBack:(NSString *)string; @end 调用协议:#impor
    02-10
  • 刨根问底Objective-C Runtime(1)- Self & S
      刨根问底Objective-C Runtime(1)- SelfSuper - Chun Tips专注iOS开发 刨根问底Objective-C Runtime(1)- SelfSuper前言关于Objective-C Runtime一篇好的文档 : Understanding the Objective-C Runtime译文地址为: http://blog.cocoabit.com/blog/2
    02-10
  • Objective-C利用协议实现回调函数
    实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下: 实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate//回调函数-(void)messageCallBack:(NSString *)string;@end  调用协议:#import Founda
    02-10
  • Objective-c开发中混合使用ARC
    首选“Compile Sources”的位置:选中工程-TARGETS-相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了。如何在未使用arc的工程中引入一个使用了arc特性的文件:对相应的文件添加:-fobjc-arc参数如何在arc工程中引用未使用arc的文件
    02-10
  • Objective C运行时(runtime)技术总结,好强大
    前言:         Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表、属性列表、变量列表,修改方法、属性,增加方法,属性等等,本文对相关的几个要点做了一个小结。目录:(1)使用class_replaceMethod/cla
    02-09
  • Programming With Objective-C---- Introductio
    a:link { color: rgba(88, 114, 210, 1); text-decoration: none }a:visited { color: rgba(88, 114, 210, 1); text-decoration: none }a:hover { color: rgba(173, 189, 248, 1); text-decoration: none }a:active { color: rgba(0, 0, 255, 1); text-decora
    02-09
点击排行