1

次の RubyCocoa は、Max OS X 10.6 では問題ありませんが、10.7 では segfault になります。

require 'osx/cocoa'
include OSX
bytes = [128].pack('i1')
NSData.alloc.initWithBytes_length(bytes, bytes.length)

いずれの場合も、最上位ビットが設定されていない場合に機能します。実際、いずれかのバイトに最上位ビットが設定されているバッファを渡すと、NSData.alloc が失敗するようです。

Ruby のバージョンは両方の OS で 1.8.7 であるため、NSData がバッファを異なる方法で解釈している理由を診断するのに途方に暮れています。誰でも光を当てることができますか?

4

4 に答える 4

1

RubyCocoaに取って代わるMacRubyを選ぶべきでしょう。RubyCocoaがLionで正しく動作しない(そして動作しない)可能性があります。

私はまだLionでMacRubyの経験はありませんが、うまくいく可能性は十分にあります。

于 2011-07-21T11:44:32.927 に答える
1

MacRubyはまだ完成していません-私が使っているルビーコードのいくつかでは動作しません。同じ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メソッドを呼び出します。このおもちゃのスクリプト以外にも、コアデータドキュメントにデータを入力するために使用するスクリプトが機能します。ここで、エンティティの1つにバイナリデータ属性があります

于 2011-08-03T19:55:20.077 に答える
0

これは RubyCocoa 1.0.2 で修正されています。

于 2011-09-18T15:26:18.220 に答える
0

pack符号付きオーバーフローを適切に処理していないため、問題は実際にはメモリの破損であると推測されます。答えにつながる可能性のあるいくつかのことを試してください。

  • 試すpack('C1')
  • をダンプしbytes、irb の出力と比較します。
  • パックの直後にメモリを割り当てる他の関数を呼び出します(まったく使用bytesしません)。
于 2011-08-03T20:28:17.050 に答える