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 메소드 사용

댓글

이 블로그의 인기 게시물

터미널에서 스칼라 파일 직접 컴파일, 실행

로잉 머신 운동 2달째

curses 라이브러리 간단한 정리