Objective-C SDK 中的 NSError **error

2014-05-26 20:42:03 +08:00
 jxdwinter
类似 - (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error
方法中,(NSError **) **是代表指针的指针还是可以直接理解为地址? 求大家详细帮忙解答下这里为什么要用**
谢谢.
3890 次点击
所在节点    iDev
11 条回复
damngood
2014-05-26 20:56:46 +08:00
指针的指针

如果仅仅是传一个 error 指针的话,在 callee 方法里面新 alloc 的 error 对象你在 caller 方法里面是获取不到的。

所以你可以放心的传一个 nil error的地址过去
guitarkitten
2014-05-26 21:08:09 +08:00
使用一个函数改变一个指针指向的位置,这个时候需要把这个指针的地址传递给这个函数,初学者的问题了,大家都会遇到
guitarkitten
2014-05-26 21:12:19 +08:00
@damngood arc会给你加上autorelease,你说的不是关键点
jxdwinter
2014-05-26 21:16:16 +08:00
@damngood @guitarkitten 谢谢两位的回答,我明白了是传递一个地址过去,如果有 error 产生的话,就直接把这个地址上的值改变为error 对象,但是类似- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate 这个方法里面中 *stop 也是一个地址吧,为什么就用了一个*呢?
damngood
2014-05-26 21:19:34 +08:00
@guitarkitten 你如果仔细看我的回复的话就会发现其实和你说的是一个意思,只是换了个方式而已。 和 arc 无关
dorentus
2014-05-26 21:20:04 +08:00
NSError * * error 是指向一个 NSError * 类型的变量的指针
BOOL * 是指向一个 BOOL 类型变量的指针
jxdwinter
2014-05-26 21:24:18 +08:00
@dorentus 谢谢,我还需要理解理解, C 语言的基础着实不靠谱,嘿嘿.
damngood
2014-05-26 21:29:06 +08:00
@jxdwinter 这种我觉得是 API 设计者根据使用场景甚至有些时候是传统来设计的吧。

如果是需要使用者在传递过去的指针所指向的指上面做修改的话, 就直接传个指针过去. 比如上边那个 *stop

如果是使用者可能会直接修改指针的话, 就传二阶指针过去. 比如 **NSError
jxdwinter
2014-05-26 21:37:40 +08:00
@damngood 大概明白了,谢谢. :D
jxdwinter
2014-05-26 22:27:49 +08:00
if you pass a pointer to an object to your function, the function can only modify what the pointer is pointing to.

if you pass a pointer to a pointer to an object then the function can modify the pointer to point to another object.

In the case of NSError, the function might want to create a new NSError object and pass you back a pointer to that NSError object. Thus, you need double indirection so that the pointer can be modified.

http://stackoverflow.com/a/903196/895188
favormm
2014-05-27 14:25:31 +08:00
二级指针

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/114360

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX