나는 비 ARC 환경사용하여 자기와 자기 특성
에 블록 내부의 자기를 사용할 때 메모리 관리에 대해 잘 알고 블록을 사용하고있다 그러나 나는 두 가지 특정 질문이 :
__block MyClass *blockSelf = self;
self.myBlock = ^{
blockSelf.someProperty = abc;
[blockSelf someMethod];
};
것은이 AVO됩니다
1) 난의 보관주기를 차례로 자기가 만들 수 있습니다 사용하여 유지 블록을 방지하기 위해 다음과 같이 할 __block을 사용할 수 있습니다 이해 이드는 확실히주기를 유지하지만, 이렇게함으로써 나는 스스로를 풀어 놓을 수있는 범위를 만들었고, 결국 다른 누군가에 의해 할당이 해제되었다. 그래서 이것이 일어 났을 때 self는 없어졌고 blockSelf는 쓰레기 값을 가리키고 있습니다. 자체가 할당 해제 된 후에 블록이 실행될 때 조건이있을 수 있습니다. 그런 다음 블록은 할당 해제 된 인스턴스를 사용하려고 할 때 충돌합니다. 우리는 어떻게이 상태를 피할 수 있습니까? 블록이 실행될 때 blockSelf가 유효한지 확인하고, self가 할당 해제되었을 때 블록 실행을 중단시키는 방법. 비슷한 라인에
2) 나는 다음과 같은 블록을 사용한다고 가정
__block MyClass *blockSelf = self;
self.myBlock = ^{
[blockSelf someMethod:blockSelf.someProperty];
};
// I am taking someProperty in an method argument
-(void) someMethod:(datatype*)myClassProperty
{
myClassProperty = abc;
}
이제 (이 여러있을 때 일어날 수 자체가 해제되지 않고 someProperty는 것으로 someMethod의 실행이 시작되기 전에 발표하는 상황이있을 수있다 스레드). 내가 self.someProperty = nil을하더라도; 릴리스 될 때 myClassProperty는 nil이 아니며 일부 쓰레기를 가리키고 있으므로 someMethod가 실행되면 첫 번째 행이 충돌로 이어집니다. 어떻게 이것을 피할 수 있습니까? 당신이 myBlock
을 사용하는 방법 2
1) '__block'이 아니라'__weak'이 될까요? – trojanfoe
http://dhoerl.wordpress.com/2013/04/23/i-finally-figured-out-weakself-and-strongself/ (__block이 아니라고 선언해야합니다) – l0gg3r
나는 비 아크 환경이므로 __weak을 사용할 수 없습니다. –