2014-12-02 1 views
1

블록 프로그래밍에 익숙하지 않습니다. 나는 내 리스너 클래스 (호를 사용하지 않는) 코드를 다음 있습니다 : addObserverForName을 사용할 때 유지 사이클 : object : queue : usingBlock :

- (void)someBlock:((void)^(NSDictionary *)myDictionary)myBlock 
{ 
    __block Listener *weakSelf = self; 
    weakSelf = [[NSNotificationCenter defaultCenter] 
        addObserverForName:@"MyNotification" 
           object:nil 
           queue:nil 
          usingBlock:^(NSNotification *note) 
     { 
      //--- Here have the retain cycles 
      myBlock(note.userInfo); 
      [[NSNotificationCenter defaultCenter] removeObserver:weakSelf 
                  name:@"MyNotification"]; 
     }]; 
} 

내 DoMyStuff 클래스의

는 :

... some code 
Listener *myListener = [[[Listener alloc] init] autorelease]; 
[myListener someBlock:((void)^(NSDictionary *)myDictionary)myBlock{ 
    [self.someProperty doSomething:myDictionary]; 
}]; 

는 사람이 나에게 보관주기를 해결하는 올바른 방향을 알 수 있습니까? 나는이 두 가지 질문

  1. "Correct management of addObserverForName:object:queue:usingBlock:"
  2. "Why doesn't Remove Observer from NSNotificationCenter:addObserverForName:usingBlock get called"

을 확인했지만 그들은 다른 블록 안에 블록을 사용하지 않았기 때문에, 솔루션은 나를 위해이 작동하지 않습니다.

+0

내 대답이 도움이 될 것입니다. –

+1

'-addObserverForName : object : queue : usingBlock :'은'self'에 대한 참조가 아니라 관찰자 역할을하는 불투명 한 객체에 대한 포인터를 반환한다는 것에주의해야합니다. –

+0

보존주기가 있다고 생각하는 이유는 무엇입니까? – newacct

답변

0

여기서 문제는 블록 내부에 [self.someProperty doSomething:myDictionary];을 사용하고 있다는 것입니다. ivars를 사용하면 self-> ivar와 동일하므로 유지주기가 발생합니다.

보통은 다음과 같습니다

__weak ClassName *weakSelf = self; 
[SomeClass someMethodWithBlock:^{ 
    // use weakSelf here; if you want to make sure that self is alive throughout whole block, do something like ClassName *strongSelf = weakSelf; 
}]; 

@ weakify/@ strongify macroses이에 대한이 좋은 라이브러리 https://github.com/jspahrsummers/libextobjc (아마 ARC 만)이 (__weak/__ unsafe_unretained은 ARC, MRR에 대한 __block입니다).

가능하면 ARC를 사용해야합니다. (정확하게 기억하고 iOS 5의 __weak가 있으며 요즘에는 괜찮을 것입니다.) iOS 4에서 사용할 수 있습니다.

+0

고맙습니다. 나는 이것을 시도했지만 내 경우에는 효과가 없었다. 나는 작전에 대한 몇 가지 의견을 달았다. – dreamhome