2013-07-27 52 views
0

驗證碼失敗Semgentation故障:11,我不明白爲什麼MacRuby的指針typedef結構

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

如果你寫你就寫了

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

即C,而SecKeychainOpen需要一個指向SecKeychainRef(這樣的輸出參數可以填寫),其他apis只需要SecKeychainRef,因此您需要取消引用指針:

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

感謝弗雷德的提示!不應該在keychainObject之前使用*作爲第三行? SecKeychainOpen(「/ Users/charbon/Library/Keychains/Josja.keychain」,* keychainObject) – MichaelC

+0

不可以。 *在紅寶石是完全不同的 –

+0

好吧,明白了,謝謝。在這裏發佈「反向」問題:http://stackoverflow.com/questions/17902293/macruby-pointer-referencing-dereferencing-when-using-cocoa-frameworks – MichaelC