문제

어리석은 질문이지만 왜 우리는 재산을 선언 할 때 '유지'를 사용해야합니까? 할당되었을 때 어쨌든 유지되지 않습니까?

이 예를 살펴보면, 할당 할 때 객체가 자동으로 유지되는 것 같습니다. 요점은 무엇입니까?

#import "Fraction.h"
#import <stdio.h>

int main( int argc, const char *argv[] ) {
    Fraction *frac1 = [[Fraction alloc] init];
    Fraction *frac2 = [[Fraction alloc] init];

    // print current counts
    printf( "Fraction 1 retain count: %i\n", [frac1 retainCount] );
    printf( "Fraction 2 retain count: %i\n", [frac2 retainCount] );

    // increment them
    [frac1 retain]; // 2
    [frac1 retain]; // 3
    [frac2 retain]; // 2

    // print current counts
    printf( "Fraction 1 retain count: %i\n", [frac1 retainCount] );
    printf( "Fraction 2 retain count: %i\n", [frac2 retainCount] );

    // decrement
    [frac1 release]; // 2
    [frac2 release]; // 1

    // print current counts
    printf( "Fraction 1 retain count: %i\n", [frac1 retainCount] );
    printf( "Fraction 2 retain count: %i\n", [frac2 retainCount] );

    // release them until they dealloc themselves
    [frac1 release]; // 1
    [frac1 release]; // 0
    [frac2 release]; // 0

■ 출력

분수 1을 유지하는 수 : 1

분수 2를 유지하는 수 : 1

분수 1을 유지합니다 : 3

분수 2를 유지합니다 : 2

분수 1을 유지합니다 : 2

분수 2를 유지하는 수 : 1

거래 분수

거래 분수


이것은 나를 미치게합니다!

도움이 되었습니까?

해결책

속성의 기본 동작은 유지되지 않고 할당됩니다. 이것들은 같은 행동이 아닙니다. 귀하의 속성이 INT와 같은 기본 데이터 유형 인 경우 할당이 올바르게 사용됩니다. 그러나 (고정)를 지정하고 속성이 nsobject *객체와 같은 객체 포인터를 가리키면 포인터에 객체의 메모리 주소가 할당되고 유지 된 카운트가 하나씩 증가합니다. 프로그램이 고독한 주요 기능으로 구성된 경우 목적은보기 어렵습니다. 그러나 수업 에이 방법이 있다고 가정합니다.

-(void)setMyArrayWithString:(NSString *)s{
    myArray = [NSArray arrayWithObject:s];
    }

MyArray가 nsarray *myArray로 정의되어 있으며 적절한 @property (retain) 문이 있다고 가정합니다. 메소드가 돌아올 때까지 모든 것이 잘 작동합니다. NSARRAY에서 반환 된 객체는 자동 엘리트 객체이기 때문입니다. 우리가 그것을 유지하지 않으면, 그것은 nsautoreleasepool에 의해 출시 될 것이며 우리는 그것을 사용할 수 없을 것입니다 (그리고 우리는 불쾌한 버그와 나쁜 액세스 위반을 얻을 것입니다). 이 문제를 해결하기 위해 두 가지 중 하나를 수행 할 수 있습니다.

-(void)setMyArrayWithString:(NSString *)s{
    self.myArray = [NSArray arrayWithObject:s];
// OR
    myArray = [[NSArray arrayWithObject:s] retain];    
}

첫 번째 솔루션은 self.myArray를 사용하여 @property 정의를 사용합니다. 이 코드는 객체를 지정하고 유지하여 함수가 반환 될 때 객체를 잃지 않도록합니다. 두 번째 솔루션은 nsarray *myArray 포인터를 수동으로 설정 한 다음 NSARRAY 객체를 수동으로 유지합니다. 어느 쪽이든 NSAUTORELEASEPOOL은 함수의 끝에서 객체를 해제하지만, 이전에 계속 유지되기 때문에 아직 유지되지 않기 때문에 거래되지 않습니다.

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