2013-08-19 3 views
4

프로젝트의 인스턴스 변수에 블록을 저장하려고합니다. 이 방법을 호출하여인스턴스 변수로 저장된 블록이 032가됩니다.

@property (nonatomic, copy)void (^loginCompletedTask)(); 

내가 변수를 할당하고있어 : 내가 인스턴스 변수를 선언 할 경우 여기이 방법의 첫 번째 줄 이후

- (void)requireLoggedInForBlock:(void (^)())completion { 
    self.loginCompletedTask = completion; 

    // Display an alert view that requires username and password input 
} 

self.loginCompletedTask 비 전무와 로그는에 디버거 유형은 NSMallocBlock입니다. 그러나 실제로 로그인 경고보기가 반환 된 후에 블록을 실행해야 할 때 해당 블록이 없습니다.

나는 시도했다 :

  • 직접 변수를 설정하는 대신 속성 (_loginCompletedTask = ...)를 사용하여
  • 설정
  • , self.loginCompletedTask = ^{completion();};로, strong 대신 copy로 선언.

무엇이 누락 되었습니까?

+0

그리고 당신은 당신이 requireLoggedInForBlock :의 객체가 그 시간까지 de-alloc()되지 않았 음을 (NSLog를 확인하기 위해 dealloc()에 넣었을 때) 꽤 확신합니다. –

+0

네, 그 개체 내 블록의 값을 로깅 해요. 그것이 0이 아니라면, 그 코드는 실행되지 않습니다. 빠른 회신 btw 주셔서 감사합니다. – aopsfan

+0

그리고 개체의 새로운 복사본을 할당하지 않았습니까? –

답변

1

블록을 잘못 저장하는 것과 아무런 관련이 없습니다. 블록을 저장했지만 실제 블록을 복사하는 것을 잊어 버린 클래스와 동일한 클래스의 새 객체를 실제로 만들었습니다. 따라서, self.loginCompletedBlock의 값을 로그 아웃 한 메소드는 다른 객체가 먼저 변수를 할당 한 메소드가 아닌 다른 객체에 의해 수신되었습니다.

귀하의 도움에 감사 드리며, SO 사용자들이 어떻게 도와 주실 수 있는지 항상 저를 놀라게합니다.

1

블록은 힙이 아니라 스택에 만들어진 유일한 개체입니다. 블록을 작성한 스택 프레임의 수명보다 오래 유지하려면 블록 copy (복사본은 힙 기반)이어야합니다. 강력한 포인터를 사용해도 스택 프레임이 팝되면 블록이 사라지지 않습니다.

ADDED : 주석이 정확하고 copy 속성으로 충분합니다. 내 잘못, 복사 속성이 거기에 있다는 사실을 잊어 버렸습니다.

+0

내 속성이 (비 원자, 사본)으로 선언되었습니다. 복사가 발생하는 정도입니까? – aopsfan

+1

하지만 그것은'@property (..., copy)'가 이미하는 것과 정확히 같습니다. –

관련 문제