Projects
Home     Blog     Install     New Ticket     View Tickets     Browse Source

Ticket #38 (closed defect: fixed)

Opened 9 months ago

Last modified 5 months ago

Unable to use NS* constants in NSObject subclass.

Reported by: alloye@… Owned by: lsansonetti@…
Priority: blocker Milestone: MacRuby 0.3
Component: MacRuby Keywords:
Cc:

Description

In tags/0.1/r89, attempting to use an NS* constant within an NSObject subclass results in a NameError. The same constants work fine in Object subclasses as illustrated below. I believe this behavior is unexpected as subclassing NSObject is a common pattern in Cocoa. The workaround of using Object may not be obvious to someone following Objective-C examples.

[~]: macirb --simple-prompt
>> framework 'Cocoa'
=> true
>> class Foo
>>   def mask
>>     NSShiftKeyMask
>>   end
>> end
=> nil
>> Foo.ancestors
=> [Foo, Object, NSObject, Kernel]
>> f = Foo.new
=> #<Foo:0x1841f10>
>> f.mask
=> 131072

[~]: macirb --simple-prompt
>> framework 'Cocoa'
=> true
>> class Bar < NSObject
>>   def mask
>>     NSShiftKeyMask
>>   end
>> end
=> nil
>> Bar.ancestors
=> [Bar, NSObject, Kernel]
>> b = Bar.alloc.init
=> #<Bar:0x18575d0>
>> b.mask
NameError: uninitialized constant Bar::NSShiftKeyMask
	from (irb):12:in `mask'
	from (irb):17
	from /Library/Frameworks/MacRuby.framework/Versions/0.1/usr/lib/ruby/1.9.0/irb.rb:149:in `block (2 levels) in eval_input'
	from /Library/Frameworks/MacRuby.framework/Versions/0.1/usr/lib/ruby/1.9.0/irb.rb:262:in `signal_status'
	from /Library/Frameworks/MacRuby.framework/Versions/0.1/usr/lib/ruby/1.9.0/irb.rb:146:in `block in eval_input'
	from /Library/Frameworks/MacRuby.framework/Versions/0.1/usr/lib/ruby/1.9.0/irb.rb:145:in `eval_input'
	from /Library/Frameworks/MacRuby.framework/Versions/0.1/usr/lib/ruby/1.9.0/irb.rb:69:in `block in start'
	from /Library/Frameworks/MacRuby.framework/Versions/0.1/usr/lib/ruby/1.9.0/irb.rb:68:in `catch'
	from /Library/Frameworks/MacRuby.framework/Versions/0.1/usr/lib/ruby/1.9.0/irb.rb:68:in `start'
	from /usr/local/bin/macirb:12:in `<main>'

Change History

Changed 9 months ago by lsansonetti@…

The problem is that NSObject doesn't include Object in which the constants are defined.

But in MacRuby you should never have to subclass NSObject. Because all Ruby classes automatically inherit from NSObject.

$ macruby -ve "class Foo; end; p Foo.ancestors"
MacRuby version 0.2 (ruby 1.9.0 2008-03-01) [universal-darwin9.0]
[Foo, Object, NSObject, Kernel]

However we should still support this.

Changed 9 months ago by alloye@…

Perhaps it's an issue that can be addressed in the documentation. I have no problem deriving from Object, but there are many Objective-C examples in the world with objects that look like this:

@interface MyController : NSObject
    ...
@end

Someone converting to MacRuby might naturally guess they should do this:

class MyController < NSObject
  ...
end

Changed 7 months ago by eloy.de.enige@…

This is also definitely a problem for me with the RC layer, because obviously all RC code is NSObject subclasses, not Object.

Changed 6 months ago by lsansonetti@…

  • milestone changed from MacRuby 0.2 to MacRuby 0.3

Changed 5 months ago by lsansonetti@…

This is addressed in trunk. Inheriting from NSObject directory will raise a warning and automatically inherit from Object.

$ macirb 
>> framework 'Cocoa'
=> true
>> class Foo < NSObject
>>   def mask; NSShiftKeyMask; end
>> end
(irb):3: warning: Do not subclass NSObject directly, please subclass Object instead.
=> nil
>> Foo.new.mask
=> 131072

Changed 5 months ago by lsansonetti@…

  • status changed from new to closed
  • resolution set to fixed
Note: See TracTickets for help on using tickets.