【问题标题】:MacRuby Pointer to typedef structMacRuby 指向 typedef 结构的指针
【发布时间】:2013-07-27 14:54:32
【问题描述】:

此代码因 Semgentation Fault: 11 而失败,我不明白为什么

framework 'Cocoa'
framework 'CoreFoundation'
framework 'Security'
* keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
SecKeychainLock(keychainObject)

我确定它与 keychainObject 类型有关,因为它有效(它锁定了默认钥匙串)。

SecKeychainLock(nil) 

我使用 '^{OpaqueSecKeychainRef}' 作为指针类型,因为当我使用错误类型的指针时,调试器告诉我它所期望的。

我希望解决这个问题有助于掌握 macruby / cocoa 魔法。

供参考,完整的输出是

cobalt:~ charbon$ macirb Desktop/test.rb 
irb(main):001:0> framework 'Cocoa'
=> true
irb(main):002:0> framework 'CoreFoundation'
=> true
irb(main):003:0> framework 'Security'
=> true
irb(main):004:0> * keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
=> [#<Pointer:0x4007ac200>]
irb(main):005:0> SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
=> 0
irb(main):006:0> SecKeychainLock(keychainObject)
Segmentation fault: 11

【问题讨论】:

    标签: ruby cocoa pointers rubymotion macruby


    【解决方案1】:

    如果你在写 C 你会写

    SecKeychainRef keyChainRef;
    SecKeychainOpen("/path/to/...", &keychainRef);
    SecKeychainLock(keyChainRef);
    

    即而 SecKeychainOpen 需要一个指向 SecKeychainRef 的指针(以便填写输出参数),而其他 api 只需要一个 SecKeychainRef,因此您需要取消引用该指针:

    framework 'Security'
    keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
    SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
    SecKeychainLock(keychainObject.value)
    

    【讨论】:

    • 感谢 Fred 的参与!第三行不应该在 keychainObject 之前加上 * 吗? SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",*keychainObject)
    • 不。 * 在红宝石中是完全不同的东西
    • 好的,知道了,谢谢。在此处发布“反向”问题:stackoverflow.com/questions/17902293/…
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多