MacRuby指向typedef结构的指针

时间:2013-07-27 14:54:33

标签: ruby cocoa pointers rubymotion macruby

此代码因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

1 个答案:

答案 0 :(得分: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)