[Rubycocoa-devel 100] alloc.init 時のオーナーシップ

Zurück zum Archiv-Index

kimura wataru kimur****@i*****
Tue Sep 6 23:38:52 JST 2005


 木村です。

(状況)
 次の2つの例で、retainCountが異なります。
str1 = OSX::NSString.stringWithString "hello"
# str1.retainCount => 1
str2 = OSX::NSString.alloc.initWithString "world"
# str2.retainCount => 2

ruby側で発生させた直後のオブジェクトのretainCountは、ふつうは
常に1となると理解しています。
#これがまちがっていたら、この話はそもそもナシということで

osx/objc/oc_wrapper.rbのOSX::ObjCWrapper.occur_ownership?では、
alloc時にもオーナーシップが発生するとしてreleaseするので、
initXXXX時にはreleaseしないようにしているようです。
ですが、initで初期化する前のオブジェクトにreleaseメッセージを
送っても影響がないようです。

このため、alloc時のGCへのretainで+1、init時のCocoa側で+1され、合計で
retainCountが2になるようです。

(提案)
occur_ownership?の判定を変更し、retainでなく、init時にオーナーシップが
発生するものとしようと思います。

----

(提案)
ついでに。同じ箇所で、ruby側からretainしたときもreleaseして、この
retainを無効にしているようですが、この処理は不要ではないでしょうか?

(理由その1)
retainしたら、自分でreleaseすべきですし、現状ではreleaseしたら
releaseが過剰になってしまうために、たぶんプログラムが落ちると思います。

(理由その2)
copyXXXX系のメソッドをruby側で実装できなくなってしまいます。
あまり定義することはないとは思いますが。




-- 
kimura wataru



More information about the Rubycocoa-devel mailing list
Zurück zum Archiv-Index