[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 21:24:10 PST 2010


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



More information about the MacRuby-devel mailing list