Objective-C 我应该使用 NSError 以及为啥 presentError 函数不起作用
Posted
技术标签:
【中文标题】Objective-C 我应该使用 NSError 以及为啥 presentError 函数不起作用【英文标题】:Objective-C should I be using NSError and why presentError function not workingObjective-C 我应该使用 NSError 以及为什么 presentError 函数不起作用 【发布时间】:2012-10-29 15:20:38 【问题描述】:我正在 iPhone 上创建一个应用程序,我将编写代码和 Java 并翻译成 Objective-C,因为该应用程序必须在 android 和 iPhone 中以类似方式工作。现在的问题当然是在某些领域的语言差异很大,并且很难正确实施。
其中一个当然不同的地方是你不能创建只接受某种类型的对象的 NSMutableArrays 或 NSMutableDictionaries。因此,当我为这些对象创建 getter 和 setter 时,我一直在这样做,示例如下:
-(void)setPerson:(NSMutableArray *)personList_p
BOOL bAllowed = YES;
for(int i = 0; i < [personList_p count]; i++)
if(![[personList_p objectAtIndex:i] isKindOfClass:[Person class]])
bAllowed = NO;
break;
else
bAllowed = YES;
if(bAllowed)
personList_i = personList_p;
else
//Raise error here
现在我最初使用的是 NSRaise Exception,但在阅读了它之后,它建议不要这样做,因为异常处理是资源密集型的,不应该用于这种类型的情况。所以我阅读的 NSError 是一个很好的解决方案,所以我正在阅读本指南
http://www.cimgf.com/2008/04/04/cocoa-tutorial-using-nserror-to-great-effect/
我的问题有两个,如果我决定使用 NSError 应该,在方法中声明 NSError 对象是否是最佳实践,即像这样
-(void)setPerson:(NSMutableArray *)personList_p : (NSError **)error
或者只在上面的else语句中声明错误就可以了,像这样
NSError *error = nil;
NSMutableDictionary* details = [NSMutableDictionary dictionary];
[details setValue:@"Invalid object passed into Array, object must be of type Person." forKey:NSLocalizedDescriptionKey];
error = [NSError errorWithDomain:@"Invalid Object" code:200 userInfo:details];
NSLog(@"%@", [error localizedDescription]);
其次,在我上面链接的指南中,作者说的结论中
在这个例子中,我正在检查错误是否仍然为零 我的留言电话。如果它不再是 nil 我知道发生了错误 并且我需要将其显示给用户。 Apple 提供了一个内置的 方法来调用 presentError: 在 NSApplication 实例
他在这里使用了这行代码
[NSApp presentError:error];
这对我不起作用,我没有使用此代码获得自动完成选项,只是说使用了未声明的标识符。我在这里遗漏了什么明显的东西吗?
另外,为了确定,我使用的方法是确保用户发送具有正确对象类型的数组的最佳方法吗?或者是否可以使用另一种方法来实现相同的目标,但以更有效的方式。
提前致谢!!
编辑:
另外一个问题,使用 NSException 会不会是个坏主意,因为 NSError 的问题是应用程序继续运行,我正在考虑使用它,所以如果他们确实传入了一个包含无效对象的数组,那么它只是导致应用程序崩溃并引发异常。我不应该这样做有什么主要原因吗??
【问题讨论】:
【参考方案1】:现在我最初使用的是 NSRaise Exception,但在阅读之后 就它而言,它建议不要这样做,因为异常处理是资源 密集的,不应该用于这种情况。所以 我阅读的 NSError 是一个很好的解决方案,所以我正在阅读本指南
他实际上并没有说引发异常本质上是不好的或资源密集型的,他认为@try/catch 是错误的处理方式。那样的话,Cocoa 应用程序(更何况我是 Cocoa-Touch)应该尽可能避免抛出异常。异常表示未定义的行为,而不是简单的错误。
其次,在我上面链接的指南中,作者在结论中...... 这里使用这行代码
[NSApp presentError:error];
这对我不起作用,我没有获得自动完成选项 这段代码,只是说使用了未声明的标识符。我失踪了吗 这里有什么明显的东西吗?
这是因为 NSApp 是一个只有 Cocoa(或 Mac)应用程序才能访问的概念。它代表一个指向“应用程序本身”的指针,并有一些与之相关的非常简洁的功能。当然,ios 没有并行的概念,所以错误通常以UIAlertView 的形式呈现。
附加问题,使用 NSException 会不会是个坏主意, 由于 NSError 的问题是应用程序继续运行,我正在考虑 有了它,如果他们确实传入了一个带有无效对象的数组,那 它只会导致应用程序崩溃并引发异常。是 我不应该这样做有什么主要原因吗??
将 NSException 用于除了非常严重的逻辑之外的任何事情通常是一个坏主意(例如当调用超出 NSArray 边界的索引时,或者当 UITableView 的数据源恰好不同步时符合表的要求)。如果您绝对必须停止程序执行,使用NSAssert()
抛出条件异常会更干净。即便如此,setter 也不是抛出异常的地方。当条件失败时简单地返回 nil 会容易得多,然后让调用者检查这样的结果并适当地处理它。
【讨论】:
非常感谢您提供的信息!我将尝试使用 NSAssert,进行了一些测试,看起来很不错,但是我会考虑你的观点,我也会尝试返回 nil 并以这种方式处理它,看看哪种方法最适合应用程序。再次感谢您的帮助! 另外,另一个小问题,如果 NSAssert 也导致应用程序抛出异常,那与使用 NSRaiseException 有什么不同?还是我在这里遗漏了一些明显的东西 NSAssert 是有条件地抛出异常的更简洁的方法。 我正在进一步阅读它,它非常有用,当您准备发布您的应用程序时,它会自动将它们全部删除,因此它是用于开发目的的绝佳工具,因为它使调试变得非常简单。希望我早点知道这一点,为教我而欢呼!以上是关于Objective-C 我应该使用 NSError 以及为啥 presentError 函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在Objective-c中,我应该使用啥来返回该参数不能为零?
我可以在 Objective-C 的 init 中包含 NSError** 作为参数吗?