我正在 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 提供了一个内置方法来执行此操作,方法是在 NSApplication 实例上调用 presentError:
他在这里使用了这行代码
[NSApp presentError:error];
这对我不起作用,我没有使用此代码获得自动完成选项,只是说使用了未声明的标识符。我在这里遗漏了一些明显的东西吗?
另外,为了确定,我使用的方法是确保用户发送具有正确对象类型的数组的最佳方法吗?或者是否可以使用另一种方法来实现相同的目标,但以更有效的方式。
提前致谢!!
编辑:
附加问题,使用 NSException 会不会是个坏主意,因为 NSError 的问题是应用程序继续运行,我正在考虑使用它,所以如果他们确实传入了一个包含无效对象的数组,它只会导致应用程序崩溃并引发异常。我不应该这样做有什么主要原因吗?