블록에 약한 참조 속성을 가진 클래스가 있습니다. 이 같은이 블록을 사용하는 클래스의 다른 지점에서약하게 유지 된 블록이 "자체"를 캡처 할 때 보유주기를 발생시키는 방법
@interface BlockTest : NSObject
@property (nonatomic, weak) void(^testBlock)();
@end
:
- (void)foobar {
self.testBlock = ^{
[self doSomething];
};
}
컴파일러 (애플 LLVM 3.0) self
강하게 여기에 포착되기 때문에 유지주기가있을 수 있습니다 뿌려줍니다. 그러나 블록 자체가 __weak
참조이므로 유지주기가 어떻게되는지 알 수 없으므로 문제가되지 않습니다. ARC 약한 참조를 올바르게 이해했다면 -foobar
메서드가 self.testBlock
으로 전달 된 블록을 반환 할 때 할당 해제되어야하며 그렇지 않은 경우 self
을 릴리스해야합니다.
컴파일러가 계속 유지주기가 있다고 생각하는 이유는 무엇입니까?
설치 프로그램이 거의 쓸모가 없습니다. 블록은 함수에 대한 강력한 참조가 없으므로 함수가 종료 된 후 즉시 할당이 해제됩니다. 속성은'nil'이 될 것입니다. – newacct
그건 보편적으로 사실이 아닙니다. 전역 및 스택 블록은 유지되거나 해제되지 않으므로 할당 후에도 유효합니다 (현재 범위 끝까지의 스택 블록). 또한 그것은 단지 샘플입니다. 아이디어는 블록을 주변에 유지하는 것이 아닙니다. IIRC이 질문을 할 때 나는 경고를 발생시키지 않으면 서'self'라는 메서드의 콜백 블록에'self'를 포착 할 방법을 찾고있었습니다. – Alfonso