1

以下 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

4 回答 4

1

您可能应该选择MacRuby,因为它将取代 RubyCocoa。RubyCocoa 可能不会(也永远不会)在 Lion 上正常工作。

我还没有任何使用 Lion 的 MacRuby 经验,但它很有可能会起作用。

于 2011-07-21T11:44:32.927 回答
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 方法等。除了这个玩具脚本之外,它还可以工作一个我用来填充核心数据文档的脚本,其中一个实体具有二进制数据属性

于 2011-08-03T19:55:20.077 回答
0

我猜这个问题实际上是在pack破坏内存,因为它没有很好地处理签名溢出。一些可以尝试的事情可能会引导您找到答案:

  • 尝试pack('C1')
  • Dump out bytes,与 irb 的输出进行比较。
  • 在打包后调用其他一些分配内存的函数(根本不使用bytes)。
于 2011-08-03T20:28:17.050 回答
0

这在 RubyCocoa 1.0.2 中已修复

于 2011-09-18T15:26:18.220 回答