1

Cocoa 类中有一些方法可以接受指针的地址。最常见的参数是NSError *CoreData 验证方法(等等)中未来对象的地址。这样就可以将自定义或拥有的对象放入给定参数指向的地址的位置。

我的问题是:为什么我们不能用简单的指针参数来做到这一点?例如,假设我有一个方法:

- (void)addObject:(id)someObject toArray:(NSMutableArray *)array;

我可以轻松地将可变数组作为第二个参数传递,调用addObject:它,在方法调用之后数组将被修改。为什么这不是用NSError *对象完成的?默认情况下,传递给方法的指针是否定义为 const?这是为了避免访问NULL吗?

4

3 回答 3

2

为什么这不是用 NSError * 对象完成的?

因为没有NSMutableError. 您的示例有效,因为您可以在不修改指向数组本身的指针的情况下修改数组的内容。但是,由于NSError实例是不可变的,因此您不能修改NSError. 因此,您必须创建一个新的错误对象。而且,如果您想将该错误对象与其他一些数据一起返回,则至少其中一个必须通过输出参数(例如 an NSError **)完成。

默认情况下,传递给方法的指针是否定义为 const?

没有。在该方法中,欢迎您这样做:

- (void)addObject:(id)someObject toArray:(NSMutableArray *)array {
  someObject = somethingElse;
  [array addObject:someObject];
}

这里要记住的重要一点是,您只是在更改内存插槽中的指针。对应的内存槽someObject只是堆栈上的一个空间,并且您正在更改该空间的内容以具有指向与给定对象不同的分配对象的值。

这是为了避免访问NULL吗?

您需要的任何NULL保护都必须自己完成。

于 2012-06-04T15:29:11.890 回答
1

这是因为NSError该类没有定义任何在创建后修改实例的方法。指针本身是可变的,但 anNSError不是。

于 2012-06-04T15:28:08.130 回答
0

它们都是普通的 C 指针。除非您将它们设为 const,否则它们不是 const。在 Objective-C 的大多数情况下,甚至在普通 C 中使用 const 指针都不是一件好事。 const 指针是一个微妙的概念,其含义和语法的复杂性与 Objective-C 的风格不太吻合编程。忘记它们的存在可能是一个很好的初步近似。

示例:NSArray 和 NSMutableArray - 如果 const “正确”工作,我们将不需要 NSArray 类 - 但由于 C 的设计,它不能。

** - 对于 NSError 等,想法是创建一个 NSError,而不是更改您传入的那个。换句话说,您需要一个指向指针的指针才能创建实例(即更改实际对象)。

于 2012-06-04T15:36:04.633 回答