使用Cocoa框架时,MacRuby指针,引用,解除引用

在MacRuby指向typedef结构的指针上 ,我学会了如何取消引用用它创建的指针

x=Pointer.new_with_type ... ==> use x.value, or x[0] 

干得好吃!

现在我想学习我认为的“对立面”。 我正在尝试使用此API。

 OSStatus SecKeychainCopySettings ( SecKeychainRef keychain, SecKeychainSettings *outSettings ); 

第二个参数必须是指针。 但我从来没有设法打开钥匙链的真实outSettings,我只获得默认设置。

 framework 'Security' keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}') SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject) #attempt #1 settings=Pointer.new_with_type('{SecKeychainSettings=IBBI}') SecKeychainCopySettings(keychainObject.value, settings) p settings.value # #attempt #2 settings2=SecKeychainSettings.new result = SecKeychainCopySettings(keychainObject.value, settings2) p settings2 # 

应阅读钥匙串的设置

 # 

我错过了什么?

得到它了 ! SecKeychainCopySettings的文档提到

outSettings返回时,指向钥匙串设置结构的指针。 由于此结构是版本化的,因此必须为其分配内存并在将结构传递给函数之前填写结构的版本。

所以我们不能只创建一个指向SecKeychainSettings的指针。 我们必须将指针指向的Struct的版本设置为某个东西。

 settings=Pointer.new_with_type('{SecKeychainSettings=IBBI}') #settings[0] dereferences the Pointer #for some reason, settings[0][0]=1 does not work, nor settings[0].version=1 settings[0]=[1,false,false,0] #we are redefining the complete SecKeychainSettings struct # [0]=version [1]=lockOnSleep [2]=useLockInterval [3]=lockInterval result = SecKeychainCopySettings(keychainObject.value, settings) p settings => # irb(main):019:0>