0

블록이있는 클래스의 인스턴스를 만들면 해당 블록을 강력한 참조로 가리키고 해당 블록에서 개체를 참조 할 때 강력한 참조를 사용하여 해당 개체를 가리키며 강력한 참조를 만듭니다 주기. 그래서 지금참조주기가 강한 블록 및 객체?

__weak Employee *weakSelf = self; 
myBlock = ^{ 
    NSLog(@"%@", weakSelf); 
} 

, 블록이 객체에 대한 약한 참조를 가지고 있지만 가정이 경우 블록 내부 자체에 대한 강한 로컬 참조를 만들 수있는 좋은 연습입니다 :이 작업을 수행하는 경우에 따라서

자기 가리키는 객체는 할당 해제됩니다.

__weak Employee *weakSelf = self; 
myBlock = ^{ 
    Employee *innerSelf = weakSelf; 
    NSLog(@"%@", innerSelf); 
} 

내가 알고 내가 올바르게 이해 있는지 확인하고 싶었다, 그래서 나는 (내가 틀렸다 경우에, 저를 수정하시기 바랍니다) 일어나는 생각의 그림 그린 : enter image description here

또는 이 정확한지 : enter image description here

수정 된 시각은 크게 감사하겠습니다.

답변

0

그 중 어느 것도 정확하지 않습니다.

여기에는 두 개의 개체 만 있습니다. Employee 개체. 그리고 한 블록. 그게 전부 야. 당신은 myBlock는 다음과 같이 선언하지만 Employee의 인스턴스 변수의 가정, 다음 네, 그 할당함으로써 Employee 객체가 블록에 강한 참조가 어떤 보이지 않았다

.

블록은 Employee 개체에 대한 약한 참조를 가지고 있습니다.이 개체는 주변 범위에서 로컬 변수 weakSelf을 캡처하고 캡처하여 동일한 메모리 관리 특성을 갖는 블록에 암시 적 "인스턴스 변수"를 만듭니다 캡쳐 된 변수 (이 경우 약함).

블록 내부의 strongSelf은 관련이 없습니다. 그것은 단지 지역 변수입니다. 지역 변수는 인스턴스 변수가 아니므로 다른 변수를 참조하는 한 객체의 일부가 아닙니다. 지역 변수는 특정 함수 호출 기간 동안 만 존재합니다. 그들은 순환을 일으키지 않습니다.

innerSelf 이유는 목적 함수의 중간에 할당 해제되지 않는다 (동일한 객체 selfinnerSelf 가리키는 인 weakSelf 의해) 지적되도록 하였다. 함수에서 weakSelf을 여러 번 사용하려고하고 일관성을 유지하기 위해 해당 시간의 상태에 의존하는 경우에만 문제가됩니다. innerSelf을 사용하여 일관되게 기존 개체를 가리 키거나 일관되게 nil을 가리 킵니다. 여기에서는 weakSelf 만 사용하기 때문에 필요하지 않습니다.