以下RubyCocoa在Max OS X 10.6上很好,但在10.7上是段错误
require 'osx/cocoa'
include OSX
bytes = [128].pack('i1')
NSData.alloc.initWithBytes_length(bytes, bytes.length)
在所有情况下,当未设置最高位时,它都有效。事实上,NSData.alloc在传递缓冲区时似乎失败,其中任何字节都设置了最高位。
两个操作系统上的Ruby版本都是1.8.7,所以我无法诊断为什么NSData以不同的方式解释缓冲区。任何人都可以放弃任何光明吗?
答案 0 :(得分:1)
你应该选择MacRuby,因为它将取代RubyCocoa。 RubyCocoa可能(并且永远不会)在Lion上正常工作。
我还没有任何关于Lion的MacRuby经验,但很有可能它会起作用。
答案 1 :(得分:1)
MacRuby仍未完成 - 它只是不适用于我使用的一些ruby代码。 我遇到了相同的NSData问题,我能够使用以下代码创建一个CFData实例
gem 'RubyInline'
require 'inline'
class CFDataWrapper
begin
inline do |builder|
builder.include "<CoreFoundation/CoreFoundation.h>"
builder.c_raw_singleton "
static VALUE fromString(int argc, VALUE *args){
CFDataRef d = CFDataCreate(NULL, RSTRING_PTR(args[0]), RSTRING_LEN(args[0]));
VALUE result;
char type = '@';
ocdata_to_rbobj(Qnil,&type, (const void *)&d, &result, false) ;
return result;
}
"
end
end
end
bytes = [128].pack('i1')
data = CFDataWrapper.fromString(bytes)
puts data.inspect
inspect的输出与10.6下的不同,但是我可以将它传递回期望NSData实例的方法,它们似乎可以工作,在它上面调用NSData方法等。除了这个玩具脚本之外,它还可以用来填充核心的脚本数据文档,其中一个实体具有二进制数据属性
答案 2 :(得分:0)
我猜这个问题实际上是pack
破坏了内存,因为它没有以良好的方式处理签名的溢出。有些事情可以引导您找到答案:
pack('C1')
bytes
,与irb的输出进行比较。 bytes
)。 答案 3 :(得分:0)
这已在RubyCocoa 1.0.2中修复