[MacRuby-devel] Behaviour when local variables pointing to non-auto-retained objects go out of scope?
Laurent Sansonetti
lsansonetti at apple.com
Wed Jan 6 22:17:26 PST 2010
I believe the reason is because your sleep 1 prevented a non-
deterministic garbage collection cycle. In the presence of a Cocoa run
loop the GC might be triggered by a few different ways. I believe
you're just lucky that it works :)
Laurent
On Jan 6, 2010, at 10:03 PM, Michael Johnston wrote:
> I figured that was the case, and that is why I switched to using an
> instance variable which will stick around after
> applicationDidFinishLaunching finishes, but I'm still puzzled by
> why the local variable does not get if I add a "sleep 1". IE, in my
> original snippet, leaving status_item as a local, which should go
> out of scope when applicationDidFinishLaunching finishes, if I put
> a "sleep 1" at the end of applicationDidFinishLaunching, the status
> item never disappears (or at least it hasn't after much more than 1
> second)
>
> Cheerio,
>
> Michael Johnston
> lastobelus at mac.com
>
>
>
>
> On 6-Jan-10, at 9:24 PM, Laurent Sansonetti wrote:
>
>> Hi Michael,
>>
>> I did not give your snippet a try, but looking quickly at the
>> documentation for -[NSStatusBar statusItemWithLength:] I saw:
>>
>> "The receiver does not retain a reference to the status item, so
>> you need to retain it. Otherwise, the object is removed from the
>> status bar when it is deallocated."
>>
>> It's probably what's causing the problem here. Your status item
>> reference is not retained in the program, so it's promoted for
>> garbage collection. Try keeping a reference to it (for example
>> using an instance variable instead of a local variable) :)
>>
>> HTH,
>> Laurent
>>
>> On Jan 5, 2010, at 1:30 AM, Michael Johnston wrote:
>>
>>> I just purchased the book Programming Cocoa with Ruby, and am
>>> working through the examples using Macruby.
>>>
>>> This tiny app works fine in rubycocoa, but in macruby the created
>>> statusbar item immediately disappears.
>>>
>>> {{{
>>> #!/usr/bin/env macruby
>>> framework 'cocoa'
>>>
>>> class App
>>> def applicationDidFinishLaunching(aNotification)
>>> statusbar = NSStatusBar.systemStatusBar
>>> status_item = statusbar.statusItemWithLength
>>> (NSVariableStatusItemLength)
>>>
>>> image = NSImage.alloc.initWithContentsOfFile("stretch.tiff")
>>> raise "Icon file 'stretch.tiff' is missing." unless image
>>>
>>> status_item.setImage(image)
>>> end
>>> end
>>>
>>> NSApplication.sharedApplication
>>> NSApp.delegate = App.new
>>> NSApp.run
>>>
>>> }}}
>>>
>>> I assumed this had to do with garbage collection because in obj C
>>> status_item would have to be retained, and so I changed
>>> "status_item" to "@status_item" and then it works fine.
>>>
>>> However while playing around with it I also noticed that if I
>>> leave status_item as a local var and add a "sleep 1" at the end of
>>> applicationDidFinishLaunching, it also works fine and the status
>>> item never disappears.
>>>
>>> So now I'm not sure whether there is a bug or not. In general,
>>> what is the intended behaviour of Macruby with local variables
>>> referring to objects that would have to be retained in obj C when
>>> said variables go out of scope?
>>> Cheerio,
>>>
>>> Michael Johnston
>>> lastobelus at mac.com
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> MacRuby-devel mailing list
>>> MacRuby-devel at lists.macosforge.org
>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel at lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
More information about the MacRuby-devel
mailing list