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

时间:2013-07-27 20:47:02

标签: objective-c ruby cocoa pointers macruby

MacRuby Pointer to typedef struct上,我学习了如何取消引用用

创建的指针
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
#<SecKeychainSettings version=0 lockOnSleep=false useLockInterval=false lockInterval=0>

#attempt #2
settings2=SecKeychainSettings.new
result = SecKeychainCopySettings(keychainObject.value, settings2)
p settings2
#<SecKeychainSettings version=0 lockOnSleep=false useLockInterval=false lockInterval=0>

打开钥匙串的设置应为

#<SecKeychainSettings version=0 lockOnSleep=true useLockInterval=true lockInterval=1800>

我错过了什么?

1 个答案:

答案 0 :(得分:0)

知道了! 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
=> #<SecKeychainSettings version=1 lockOnSleep=true useLockInterval=false lockInterval=300> irb(main):019:0>