2011-07-21 32 views
1

以下RubyCocoa是在Max OS X 10.6很好,但是當最高位沒有被設置在10.7分段故障> 127

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

在它的工作原理所有情況下段錯誤。實際上NSData.alloc在傳遞一個緩衝區時似乎失敗了,其中任何一個字節都設置了最高位。

在這兩個操作系統上,Ruby的版本都是1.8.7,所以我不知道爲什麼NSData會以不同方式解釋緩衝區。任何人都可以擺脫光線嗎?

+0

與從而進一步玩,我可以找到一個NSData或NSMutableData構造這樣的作品,也不CFDataCreate沒有呼叫。 –

回答

0

這是固定在RubyCocoa 1.0.2

1

你應該去MacRuby,因爲它會取代RubyCocoa。 RubyCocoa可能不會(也永遠不會)在Lion上正常工作。

我還沒有任何使用Lion的MacRuby經驗,但機會很好,它會工作。

+0

的確,但是由於我有一個重要的RubyCocoa代碼庫,而且MacRuby還沒有發佈,所以我目前已經崩潰了。 –

1

MacRuby尚未完成 - 它只是不適用於我工作的一些ruby代碼。 我碰到同樣的NSData的問題,我能創造這似乎與OK下面的代碼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 

從檢查的輸出是由10.6下不同,但我可以通過它放回方法,期望的NSData實例,他們似乎工作,調用它的NSData方法等。除了這個玩具腳本它工作的腳本我用來填充核心數據文件,其中一個實體有一個二進制數據屬性

+0

謝謝,也許獅子改變了一些影響兩者 –

0

我會猜測問題實際上是pack破壞內存,因爲它沒有很好地處理簽名溢出。有些事情要嘗試,可能會導致您的答案:

  • 嘗試pack('C1')
  • dump出來bytes,比較IRB的輸出。
  • 調用一些其他功能,在包裝後立即分配內存(根本不使用bytes)。
+0

我不認爲它是包,因爲這是標準的紅寶石 –