[MacRuby-devel] Behaviour when local variables pointing to non-auto-retained objects go out of scope?
Michael Johnston
lastobelus at mac.com
Wed Jan 6 22:03:28 PST 2010
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
More information about the MacRuby-devel
mailing list