속성이있는 메모리 관리
-
06-07-2019 - |
문제
Objective-C에서 메모리 관리를 더 잘 이해하기 시작했지만 이해하지 못하는 것이 있습니다. 이것은 재산 선언입니다.
@property (nonatomic, retain)UILabel *myLabel;
그리고 이것은 보이지 않는 합성 세터입니다.
- (void)setMyLabel:(UILabel *)newValue {
if(myLabel != newValue) {
[myLabel release];
myLabel = [newValue retain];
}
}
매번 유지하는 모든 작업과 물건을 절약 할 수 있지만, 처음으로 내 재산을 설정했다고 말하면서, 그 참조 수는 0이지 않습니까? 그래서 나는한다
UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];
나는 아무것도 풀지 않을 때 어떤 일이 일어나는지 확실하지 않지만, 재산에 이미 가치가 있다고 말하면 우리는 그것을 설정합니다. 세터에서 먼저 출시됩니다. 그래서 그게 해체되지 않습니까? 참조 수는 하나 인 다음 세트에서 릴리스 된 경우 어떻게 유지 된 새 가치로 설정되도록 어떻게 유지됩니까?
감사!!
다른 팁
mylabel의 초기 값은 NIL이므로 재산에 대한 첫 번째 과제, 즉
self.myLabel = tempLabel;
NIL, IE [NIL 릴리스]를 출시합니다. 객관적 C에서는 NIL에 메시지를 보내는 것이 NO-OP이므로 아무것도하지 않습니다.
마찬가지로, 거래소 방법에서는 다음과 같습니다.
[myLabel release];
속성이 할당 된 경우 Mylabel을 해제하여 세터의 [NewValue Retain]의 균형을 맞추겠습니다. 속성이 할당 된 적이 없다면 여전히 NIL이 될 것이며 다시 [NIL 릴리스]는 NO-OP가됩니다.
읽기 메모리 관리 규칙 객체를 유지/릴리스 해야하는 시점에 대한 정확한 규칙의 경우.
모든 소유자가 양도되었을 때 물체는 "사라집니다 (즉, 거래 될 것입니다). 즉, 모든 Alloc/Copy/New 통화가 릴리스/AutoreLease 호출과 균형을 잡았을 때 (또는 얼마 후) 균형을 잡았습니다.
저는 Objective-C에도 비교적 처음이지만 내 이해를 재확인하기 위해 이에 대답하려고합니다.
내 재산을 처음으로 설정했다고 가정 해 봅시다. 아직 할당되지 않았지만 참조 수는 0입니다.
예, 유지 카운트는 0입니다.
세터에서 먼저 출시됩니다. 그래서 그게 해체되지 않습니까?
보유 수에서 1을 빼냅니다 myLabel
. MyLabel의 유지 수가 0에 도달하면 데이터 또는 객체 myLabel
변수가 메모리에서 해방 될 것으로 예상됩니다.
참조 수는 하나 인 다음 세트에서 릴리스 된 경우 어떻게 유지 된 새 가치로 설정되도록 어떻게 유지됩니까?
이 시나리오에서는 데이터입니다 myLabel
해방 될 것입니다 (유지 횟수는 0). myLabel
그런 다음 Nil을 가리 킵니다 (비어 있습니다). 변수는 클래스에서 설정되며 항상 해당 세터에 메시지를 수락 할 수 있으므로 새 데이터를 다음으로 할당 할 수 있습니다. myLabel
~이든 myLabel
의지 수는 0 또는 100입니다.