Ruby, MacRuby의 차이점 / 확장점
MacRuby : The Definitive Guide에서 참조
- Objective C의 @selector가 메소드 이름 뒤에 :을 붙인 문자열로 바뀜
button.action = 'say_hello:' - Objective C의 k로 시작하는 상수들이 (ruby의 상수는 대문자로 시작하므로) K로 시작
- is... 함수는 ...? 형식으로 사용가능
isSpeaking vs. speaking? - set... 함수는 . 형식으로 사용가능
object.setFoo = bar vs. object.foo = bar - objectForKey와 setObject:forKey는 []형식으로 사용가능
keyedObject.setObject('bar', :forKey=>'foo') vs. object['foo'] = bar - 문자열을 NSData로 변환 하는 to_data 함수 추가
- object를 property list로 변환하는 to_plist 함수 추가
[1, 'two', {'three'=>3}, true, false].to_plist - outlet은 attr_accessor를 생성하면 interface builder가 outlet으로 인식
attr_accessor :button - String, Array, Hash, Integer, Float, Time은 각각 NS(Mutable)String, NS(Mutable)Array, NS(Mutable)Dictionary, NSNumber, NSNumber, NSDate와 완전 호환되며 objective C 메소드나 ruby 메소드 아무것이나 사용가능
ruby object는 대부분 mutable이나 인자를 전달하면 mutable이 immutable로 바뀔 수 있다 -> mutable한 object를 원하면 mutableCopy 메소드 호출, 반대의 경우 copy 메소드 호출 - Set, Enumerator, Date는 objective C와 호환되지 않는다
- NSDate.dateWithNaturalLanguageString 함수
NSDate.dateWithString(Time.now.to_s) - NSData는 CFDataRef에 그대로 사용할 수 있다
'String'.dataUsingEncoding(NSUTF8StringEncoding)
NSString.alloc.initWithData(data, encoding:NSUTF8StringEncoding) - NSObject를 subclass할때 custom init에서 self 반환하는 것을 잊지 말라
class MyOperation < NSOperation
def initWithName(name)
init
@name = name
self
end - notification이 제대로 동작하지 않는 경우 observer가 garbage collect되지 않았는지 의심해 보라. instance 변수로 저장하면 garbage collection을 간단히 피할 수 있다
- 각각 thread는 별개의 notification center 가진다
- to_plist, load_plist
to_yaml, YAML.load_file
to_json, JSON.parse File.open('...').read - MacRuby는 ruby accessor에 자동으로 KVC 코드를 생성한다
class Player attr_accessor :points end
matt.points = 42; matt.setPoints(42); matt.valueForKey('points') - valueForKeyPath 는 hash와 같은 자료의 하부까지 탐색할 수 있다. 하지만, 'siblings.brothers[0]'와 같은 index까지 지정할 수는 없다
- pointer
pointer = Pointer.new(:char | :string | :integer | :short | :long | :uchar | :uint | :ushort | :ulong | :float | :object or :id | :boolean | :class | :selector)
dereference는 array와 같이 pointer[0]
void형으로 받은 값을 쓰기 위해서는 cast! 메소드 사용
OpenGL과 같이 integer값을 void* 포인터로 받는 경우 magic_cookie 메소드 사용
함수가 pointer 형으로 개체를 바로 반환하는 경우 cast후 dereference로 변환할 수 없고 to_object 메소드 사용
댓글