2011-07-26 4 views
3

선택기 alertDidEnd:returnCode:contextInfo:을 구현했습니다. 마지막 매개 변수 인 contextInfo는 void 포인터입니다. 메서드를 호출하기 전에 다음과 같이 포인터를 놓습니다.왜 내 Macruby 포인터가 void 포인터로 전달되는 동안 살아남지 못합니까?

# in windowShouldClose 
p = Pointer.new(:boolean) 
p.assign(true) 

는 다음 나는 메소드를 호출하고, 몸 안에 다음과 같은 한 : 내가 잘못 뭐하는 거지

# in alertDidEnd 
puts p[0] # => a number like 245 
puts p.cast!('B')[0] # => false (rather than true) 

? 이것은 셀렉터가 기회를 갖기 전에 호출 메소드 (windowShouldClose)가 자체 스레드에서 종료되기 때문입니다 (단지 추측)?

아니면 포인터를 객체 포인터로 만들어야합니까?

# make a pointer to an object and assign to it the instance of TrueClass 
p = Pointer.new(:id) 
p.assign(true) 

이 글은 O'reilly Macruby Book에 대해 읽었습니다.

감사합니다.

답변

2

가비지 수집을 위해이 객체를 유지하는 것이 아무 것도 없습니다. 객체를 만들고 finalize 메소드를 구현하고 거기에 풋을 넣으면이 경우를 볼 수 있습니다.

시트를 생성하는 컨트롤러에서 상태를 추적하고 contextInfo로 컨트롤러에 포인터를 전달하십시오. 이 상태가 UI 요소 간의 동시 상호 작용을 중재하는 경우 모든 요소를 ​​담당하는 컨트롤러가 어쨌든이를 추적해야합니다. 물론 contextInfo를 전달하지 않고 어떤 콜백을 사용하면 시트가 어떤 조건에서 호출되었는지 추적 할 수 있습니다.