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