Objective C方法中的参数指针是默认的const吗?

时间:2012-06-04 15:21:45

标签: objective-c pointers

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

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

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

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

3 个答案:

答案 0 :(得分:2)

  

为什么没有使用NSError *对象?

因为没有NSMutableError这样的东西。您的示例有效,因为您可以修改数组的内容而无需修改指向数组本身的指针。但是,由于NSError实例是不可变的,因此您无法修改NSError。因此,您必须创建一个新的错误对象。如果您想要返回该错误对象以及其他一些数据,则必须通过out-parameter(例如NSError **)完成其中一个。

  

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

不。在这种方法中,欢迎你这样做:

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

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

  

这是为了避免访问NULL吗?

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

它们都是普通的C指针。它们不是const,除非你把它们变成const。 const指针在Objective-C中的大多数情况下都不是一件好事,甚至经常是普通的C. Const指针是一个微妙的概念,而且意义和语法的复杂性与Objective-C风格不完全吻合。节目。忘记它们存在可能是一个很好的初步近似。

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

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