Cocoa编程中的错误处理与绘图基础
立即解锁
发布时间: 2025-08-25 02:21:26 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从零开始的全面指南
### Cocoa编程中的错误处理与绘图基础
#### 1. 重新启用ARC及NSError概述
在继续之前,需要在项目中重新启用ARC(自动引用计数)。操作步骤如下:
1. 在项目导航器中选择顶级项目项。
2. 在“Build Settings”标签中找到“Objective - C Automatic Reference Counting”项并开启。
3. 由于ARC不允许显式调用`release`方法,需从应用委托的`freedObject`方法中删除`[object release];`这一行。
在Cocoa中,异常通常不用于流程控制,主要用于指出程序中的错误。而对于一些非错误但受开发者无法直接控制的情况,如文件访问错误或网络错误,Cocoa更多地使用`NSError`类来处理。接下来将了解`NSError`对象的内容、产生情况以及在代码中如何处理它。
#### 2. 错误域和错误码
不同操作系统有不同的系统错误报告方式:
| 操作系统类型 | 错误报告方式 |
| ---- | ---- |
| UNIX系统 | 每次系统调用后检查`errno`的值,它是一个整数,可与头文件中的预定义列表比较以确定错误类型。 |
| 经典Mac OS编程 | 许多系统函数返回`OSStatus`类型(本质也是整数),调用后需检查该值确保无意外发生。 |
| OS X | 是混合操作系统,底层基于UNIX,包含Cocoa框架、Carbon API和现代C语言API。不同“世界”的错误码有重叠,Apple引入了错误域的概念,通过为每个错误标记一个字符串指定其所属域,以统一处理不同来源的错误信息。 |
`NSError`类将系统级错误码封装在Objective - C对象中,每个`NSError`实例包含:
- `NSString`类型的“domain”,指定其所属的库或框架。
- 整数类型的错误码。
- 可选的`NSDictionary`,包含错误的额外信息。
Cocoa中常见的错误域有:
- `NSPOSIXErrorDomain`:UNIX错误(符合POSIX标准)。
- `NSOSStatusErrorDomain`:Carbon函数产生的错误。
- `NSCocoaErrorDomain`:Cocoa自身类产生的错误。
每个预定义错误域都有对应的错误码列表,分别定义在不同的头文件中,可在Xcode中通过“Open Quickly”窗口(⌘⇧O)输入文件名查找。
#### 3. 识别错误
`NSError`对象通常通过方法调用返回,不是作为返回值,而是通过引用传入的指针。例如`NSFileManager`类的`attributesOfItemAtPath:error:`方法:
```objc
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path
error:(NSError **)error
```
该方法可用于获取指定文件或目录的文件系统信息,第二个参数`error`是`NSError **`类型,即传入指向`NSError`指针的指针。如果方法遇到错误,会创建`NSError`对象并将其地址赋给该指针。
以下是调用示例:
```objc
- (void)fileError {
NSFileManager *fileManager = [NSFileManager defaultManager];
// 声明变量并初始化为nil
NSError *fileError = nil;
// 传递fileError变量的地址给方法
NSDictionary *attributes = [fileManager
attributesOfItemAtPath:@"/tmp" error:&fileError];
// 检查方法调用是否返回NSError
if (fileError == nil) {
// 显示属性
NSRunAlertPanel(@"Found file attributes",
[attributes description], nil, nil, nil);
} else {
// 报告错误
[NSApp presentError:fileError];
}
}
```
将上述`fileError`方法添加到应用委托类,并在`applicationDidFinishLaunching:`方法中调用`[self fileError];`,运行应用。若将路径改为不存在的路径,如`@"/tmpfoo"`,方法会遇到错误并返回`NSError`对象。
通过调试器可以查看错误信息:
```
(lldb) po [fileError domain]
$0 = 0x00007fff7cdab110 NSCocoaErrorDomain
(lldb) p (int)[fileError code]
(int) $1 = 260
(lldb) po [fileError localizedDescription]
$2 = 0x0000000102327470 The file "tmpfoo" couldn't be opened because there is no such file.
```
`NSError`的`localizedDes
0
0
复制全文
相关推荐










