0

我正在 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 的问题是应用程序继续运行,我正在考虑使用它,所以如果他们确实传入了一个包含无效对象的数组,它只会导致应用程序崩溃并引发异常。我不应该这样做有什么主要原因吗?

4

1 回答 1

2

现在我最初使用的是 NSRaise Exception,但在阅读了它之后,它建议不要这样做,因为异常处理是资源密集型的,不应该用于这种情况。所以我阅读的 NSError 是一个很好的解决方案,所以我正在阅读本指南

他实际上并没有说引发异常本质上是不好的或资源密集型的,他认为@try/catch 是错误的处理方式。那样的话,Cocoa 应用程序(更何况我是 Cocoa-Touch)应该尽可能避免抛出异常。异常表示未定义的行为,而不是简单的错误。

其次,在我上面链接的指南中,作者在结论中......在这里使用了这行代码

[NSApp presentError:error];

这对我不起作用,我没有使用此代码获得自动完成选项,只是说使用了未声明的标识符。我在这里遗漏了一些明显的东西吗?

那是因为 NSApp 是一个只有 Cocoa(或 Mac)应用程序才能访问的概念。它代表一个指向“应用程序本身”的指针,并有一些与之相关的非常简洁的功能。当然,iOS 没有并行的概念,因此传统上会在UIAlertView中呈现错误。

附加问题,使用 NSException 会不会是个坏主意,因为 NSError 的问题是应用程序继续运行,我正在考虑使用它,所以如果他们确实传入了一个包含无效对象的数组,它只会导致应用程序崩溃并引发异常。我不应该这样做有什么主要原因吗?

将 NSException 用于非常严重的逻辑之外的任何事情通常是一个坏主意(例如,当调用超出 NSArray 范围的索引时,或者当 UITableView 的数据源恰好与表要求)。如果您绝对必须停止程序执行,那么使用NSAssert()抛出条件异常要干净得多。即便如此,setter 也不是抛出异常的地方。当条件失败时简单地返回 nil 会容易得多,然后让调用者检查这样的结果并适当地处理它。

于 2012-10-29T22:04:09.540 回答