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
查看更多关于【Objective-C】的文章
Objective-C Runtime(转)
博主地址: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话
0评论2023-03-08434
Objective-C利用协议实现回调函数
实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下: 实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate //回调函数 -(void)messageCallBack:(NSString *)string; @end 调用协议:#impor
0评论2023-02-10480
刨根问底Objective-C Runtime(1)- Self & Super
刨根问底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
0评论2023-02-10566
Objective-C利用协议实现回调函数
实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下: 实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate//回调函数-(void)messageCallBack:(NSString *)string;@end 调用协议:#import Founda
0评论2023-02-10750
Objective-c开发中混合使用ARC
首选“Compile Sources”的位置:选中工程-TARGETS-相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了。如何在未使用arc的工程中引入一个使用了arc特性的文件:对相应的文件添加:-fobjc-arc参数如何在arc工程中引用未使用arc的文件
0评论2023-02-10774
Programming With Objective-C---- Introduction ---- Objective-C 学习(一)
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
0评论2023-02-09863
Singletons in Objective-C
BackgroundSingletons classes are an important concept to understand because they exhibit an extremtely useful design pattern.This idea is used throughout the iPhone SDK, for example, UIApplication has a method called sharedApplication which
0评论2023-02-09522
Objective-C运行时编程 - 实现自动化description方法的思路及代码示例
发布自米高 | Michael - 博客园,源地址:http://www.cnblogs.com/michaellfx/p/4232205.html,转载请注明。基础实现性能优化参考关键字:Objective-COCdescription函数自动打印属性及属性值运行时枚举成员变量基础实现使用NSLog或po,Xcode默认调用对象的des
0评论2023-02-09866
Objective-C 学习笔记 - part 11 - 错误处理
Object-C 提供类似 Java / C++风格的错误处理模型,当使用 -fobjc-exceptions 开关(gcc3.3)时,它可以工作,但是只限于 OS X v10.3 以后的版本,之前的版本并不提供这一支持。使用错误捕获的原则与其它语言类似:你不能用它来当作正常的处理流的判断条件
0评论2023-02-09893
objective-c 字符串基本操作
1.定义一个字符串a, 截取a 的某一个部分,复制给b, b必须是int型NSString *a = @"1.2.30"; int b= [[a substringWithRange:NSMakeRange(4,2)] intValue]; NSLog(@"a:%@n",a); NSLog(@"b:%d",b); 解析如下:substringWithRange: 专门截取字符串的一块肉NSMakeR
0评论2023-02-09602
Objective-C 程序设计(第六版)第十一章习题答案
1. 1 #import "Fraction.h" 23 @interface Fraction (MathOps) 45 - (Fraction *) add: (Fraction *) f; 67 - (Fraction *) mul: (Fraction *) f; 89 - (Fraction *) sub: (Fraction *) f;10 11 - (Fraction *) div: (Fraction *) f;12 13 - (Fraction *) inv
0评论2023-02-09476
Objective-C与C style语言的简单类比
1. 关于Objc中函数调用类比[_lblHelloWorld setHidden:![_lblHelloWorld isHidden]];类比为: _lblHelloWorld.setHidden(!(_lblHelloWorld.isHidden()));Tip: objc中的boolean值为YES和NO,而不是True or False -(void) helloWorld:(BOOL)isHelloWorld{}
0评论2023-02-09682