Cocoa类中有一些接受指针地址的方法。最常见的参数是CoreData验证方法(以及其他)中未来NSError *
对象的地址。这样就可以将自定义或拥有的对象放入给定参数指向的地址的位置。
我的问题是:为什么我们不能用简单的指针参数做到这一点?例如。假设我有一个方法:
- (void)addObject:(id)someObject toArray:(NSMutableArray *)array;
我可以轻松地将可变数组作为第二个参数传递,在其上调用addObject:
,并在方法调用之后修改数组。为什么不使用NSError *
个对象?传递给方法的指针默认定义为const吗?这是为了避免访问NULL
吗?
答案 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,而不是改变你传入的那个。换句话说,你需要一个指向能够创建实例的指针(即更改)实际的对象)。