V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
jxdwinter
V2EX  ›  iDev

Objective-C SDK 中的 NSError **error

  •  
  •   jxdwinter · 2014-05-26 20:42:03 +08:00 · 3873 次点击
    这是一个创建于 3836 天前的主题,其中的信息可能已经有所发展或是发生改变。
    类似 - (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error
    方法中,(NSError **) **是代表指针的指针还是可以直接理解为地址? 求大家详细帮忙解答下这里为什么要用**
    谢谢.
    11 条回复    2014-05-27 14:25:31 +08:00
    damngood
        1
    damngood  
       2014-05-26 20:56:46 +08:00
    指针的指针

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

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

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

    如果是使用者可能会直接修改指针的话, 就传二阶指针过去. 比如 **NSError
    jxdwinter
        9
    jxdwinter  
    OP
       2014-05-26 21:37:40 +08:00
    @damngood 大概明白了,谢谢. :D
    jxdwinter
        10
    jxdwinter  
    OP
       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
        11
    favormm  
       2014-05-27 14:25:31 +08:00
    二级指针
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2741 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:19 · PVG 23:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.