문제

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];

나는 아무것도 풀지 않을 때 어떤 일이 일어나는지 확실하지 않지만, 재산에 이미 가치가 있다고 말하면 우리는 그것을 설정합니다. 세터에서 먼저 출시됩니다. 그래서 그게 해체되지 않습니까? 참조 수는 하나 인 다음 세트에서 릴리스 된 경우 어떻게 유지 된 새 가치로 설정되도록 어떻게 유지됩니까?

감사!!

도움이 되었습니까?

해결책

나는 당신이 대상과 참고 문헌을 혼란스럽게 생각한다고 생각합니다. 속성은 객체 자체가 아니라 객체에 대한 참조입니다. 속성을 설정하거나 설정하지 않으면 보관하고 가리키는 객체에 릴리스를 보내지 만 참조 자체는 속성이있는 객체의 일부입니다 (이 경우 자체).

같은 것들을 읽는 것이 유용 할 수 있습니다. 포인터 그리고 lvalues.

다른 팁

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입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top