2012-10-31 4 views
0

RubyMotion을 처음 사용하고 개체 초기화 작업 방법을 이해하려고합니다. 다음 작업 않는 이유를 이제RubyMotion에서 개체 초기화

class Something 
    def self.getSomething 
    BubbleWrap::HTTP.post("http://example.com") do |response| 
     p response 
    end 
    end 

    def getSomething 
    BubbleWrap::HTTP.post("http://example.com") do |response| 
     p response 
    end 
    end 
end 

, : 하나 개의 클래스와 인스턴스 방법과 간단한 클래스를 가정하지

Something.getSomething 

그리고 다음 조각을 잘, 때때로 (이 조각과 런타임을 실행 10 회 중 8 회 충돌).

something = Something.new 
something.getSomething 

내가 잘못하고있다. 올바른 방향의 포인터?

+0

메소드 중 하나가'self.getSomething'으로되어 있습니까? –

+0

@DylanMarkow 오른쪽, 오타. 고쳤다. – Cimm

+1

이것은 RubyMotion의 로컬 변수 처리가 중요하지 않은 것과 관련이 있습니다. 대신 인스턴스 변수를 사용하면 어떻게됩니까? '@something = Something.new; @ something.getSomething' –

답변

5

사용 인스턴스 변수 :

@something = Something.new 
@something.getSomething 

RubyMotion 지역 변수와 블록 관련 버그의 소수를 가지고있다. something에 할당 한 다음 something.getSomething을 호출하면 BubbleWrap의 비동기식 HTTP.post 메서드가 사용됩니다. BubbleWrap HTTP 블록이 실행되지만 그 사이에 something.getSomething을 호출하는 메소드가 실행을 완료했습니다. something은 지역 변수이므로 메서드가 종료 될 때 가비지 수집됩니다. 따라서 HTTP 요청이 완료되고 블록이 호출되면 블록은 더 이상 존재하지 않습니다.

매번 블록이 저장된 메모리 위치가 다른 항목 (또는 한 번씩)으로 회수 되었기 때문에 무작위로 일관성없는 오류 (실제 작업 요청)가 표시 될 수 있습니다. 블록은 여전히 ​​거기에있다. 호출하는 메소드가 실행을 끝내면 인스턴스 변수가 돌아 다니기 때문에 인스턴스 변수를 대신 사용할 경우에는 아무 것도 발생하지 않습니다.

이 동작은 분명히 예상치 못한 것입니다. 나는이 문제를 해결하기 위해 몇 가지 문제가 제기되었다는 것을 안다.

+0

감사합니다. 이제는 모두 의미가 있습니다. Ruby 코드를 볼 때 비동기 적으로 생각하기를 배워야합니다. :) – Cimm