• 从 C++ 到 ObjectiveC:异常处理和多线程


    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
  • 相关阅读:
    使用Navicat for Oracle新建表空间、用户及权限赋予---来自烂泥
    NonAction与ChildActionOnly
    C# Monitor的Wait和Pulse方法使用详解
    机械键盘简介
    【转载】 中小型研发团队架构实践
    BinaryReader 自己写序列化
    显式接口实现
    AssemblyVersion和AssemblyFileVersion的区别
    自定义设置程序集版本重定向和程序集位置的信息
    单例模式中的属性实现
  • 原文地址:https://www.cnblogs.com/linyawen/p/2503422.html
Copyright © 2020-2023  润新知