[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