Lion上的分段错误从RubyCocoa创建NSData并使用任何字节> 127

时间:2011-07-21 11:29:51

标签: ruby macos osx-lion ruby-cocoa

以下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以不同的方式解释缓冲区。任何人都可以放弃任何光明吗?

4 个答案:

答案 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中修复