수색…


자동 참조 횟수

자동 참조 카운팅 (ARC)을 사용하면 컴파일러에서 필요에 따라 retain , releaseautorelease 문을 삽입하므로 사용자가 직접 작성할 필요가 없습니다. 또한 dealloc 메소드를 작성합니다.

수동 메모리 관리의 샘플 프로그램은 ARC에서 다음과 같습니다.

@interface MyObject : NSObject {
    NSString *_property;
}
@end

@implementation MyObject
@synthesize property = _property;

- (id)initWithProperty:(NSString *)property {
    if (self = [super init]) {
        _property = property;
    }
    return self;
}

- (NSString *)property {
    return property;
}

- (void)setProperty:(NSString *)property {
    _property = property;
}

@end
int main() {
    MyObject *obj = [[MyObject alloc] init];
    
    NSString *value = [[NSString alloc] initWithString:@"value"];
    [obj setProperty:value];

    [obj setProperty:@"value"];
}

dealloc 메소드를 여전히 대체하여 ARC가 처리하지 않는 자원을 정리할 수 있습니다. 수동 메모리 관리를 사용할 때와 달리 [super dealloc] 호출하지 않습니다.

-(void)dealloc {
   //clean up
}

강하고 약한 참고 문헌

현대

약한 참조는 다음 중 하나와 유사합니다.

@property (weak) NSString *property;
NSString *__weak variable;

개체에 대한 약한 참조가있는 경우에는 다음을 수행하십시오.

  • 당신은 그것을 지키고 있지 않습니다.
  • 할당이 해제되면 모든 참조는 자동으로 nil 로 설정됩니다.

개체 참조는 기본적으로 항상 강력합니다. 그러나 당신은 그들이 강하다고 명시 할 수 있습니다 :

@property (strong) NSString *property;
NSString *__strong variable;

강력한 참조는 해당 참조가있는 동안 오브젝트를 보유한다는 것을의 L합니다.

수동 메모리 관리

이것은 수동 메모리 관리로 작성된 프로그램의 예입니다. 어떤 이유로 32 비트를 지원해야 할 필요가있는 것처럼 ARC를 사용할 수 없다면 정말 이런 코드를 작성하면 안됩니다. 이 예제는 getter 및 setter를 작성하는 데 사용 된 방법을 보여주기 위해 @property 표기법을 사용하지 않습니다.

@interface MyObject : NSObject {
    NSString *_property;
}
@end

@implementation MyObject
@synthesize property = _property;

- (id)initWithProperty:(NSString *)property {
    if (self = [super init]) {
        // Grab a reference to property to make sure it doesn't go away.
        // The reference is released in dealloc.
        _property = [property retain];
    }
    return self;
}

- (NSString *)property {
    return [[property retain] autorelease];
}

- (void)setProperty:(NSString *)property {
    // Retain, then release. So setting it to the same value won't lose the reference.
    [property retain];
    [_property release];
    _property = property;
}

- (void)dealloc {
    [_property release];
    [super dealloc]; // Don't forget!
}

@end
int main() {
    // create object
    // obj is a reference that we need to release
    MyObject *obj = [[MyObject alloc] init];
    
    // We have to release value because we created it.
    NSString *value = [[NSString alloc] initWithString:@"value"];
    [obj setProperty:value];
    [value release];

    // However, string constants never need to be released.
    [obj setProperty:@"value"];
    [obj release];
}

수동 참조 카운팅을 사용할 때 메모리 관리 규칙

이 규칙은 수동 참조 횟수를 사용하는 경우에만 적용됩니다!

  1. 자신이 만든 모든 객체를 소유하고 있습니다.

    이름이 alloc , new , copy 또는 mutableCopy 시작하는 메소드를 호출합니다. 예 :

    NSObject *object1 = [[NSObject alloc] init];
    NSObject *object2 = [NSObject new];
    NSObject *object3 = [object2 copy];
    

    즉, 이러한 개체를 완료 한 후에 개체를 릴리스해야 할 책임이 있습니다.

  2. retain을 사용하여 객체의 소유권을 가져올 수 있습니다.

    오브젝트에 대한 소유권을 가져 오려면 retain 메소드를 호출하십시오.

    예 :

    NSObject *object = [NSObject new]; // object already has a retain count of 1
    [object retain]; // retain count is now 2
    

    이는 드문 상황에서만 의미가 있습니다.

    예를 들어 접근 자 또는 init 메소드를 구현하여 소유권을 가져 오는 경우 :

    - (void)setStringValue:(NSString *)stringValue {
        [_privateStringValue release]; // Release the old value, you no longer need it
        [stringValue retain]; // You make sure that this object does not get deallocated outside of your scope.
        _privateStringValue = stringValue;
    }
    
  3. 더 이상 필요하지 않으면 소유하고있는 물건의 소유권을 양도해야합니다

    NSObject* object = [NSObject new]; // The retain count is now 1
    [object performAction1]; // Now we are done with the object
    [object release]; // Release the object
    
  4. 소유하지 않은 물건에 대한 소유권을 포기해서는 안됩니다.

    즉, 객체의 소유권을 가져 가지 않으면 해제하지 않습니다.

  5. 자동 회수 풀

    autoreleasepool은 autorelease 메시지를 수신 한 블록의 모든 객체를 해제하는 코드 블록입니다.

    예:

    @autoreleasepool {
        NSString* string = [NSString stringWithString:@"We don't own this object"];
    }
    

    우리는 소유권을 갖지 않고 문자열을 만들었습니다. NSString 메서드 인 stringWithString: 문자열이 더 이상 필요 없게되면 올바르게 할당 해제되었는지 확인해야합니다. 메서드가 반환하기 전에 새로 생성 된 문자열은 autorelease 메서드를 호출하므로 문자열의 소유권을 가질 필요가 없습니다.

    다음은 stringWithString: 이 구현 된 방법입니다.

    + (NSString *)stringWithString:(NSString *)string {
        NSString *createdString = [[NSString alloc] initWithString:string];
        [createdString autorelease];
        return createdString;
    }
    

    autoreleasepool 블록을 사용할 필요가 있습니다. 때때로 소유하지 않는 객체가 있기 때문입니다 (네 번째 규칙이 항상 적용되는 것은 아닙니다).

    자동 참조 계산은 규칙을 자동으로 처리하므로 사용자가 필요하지 않습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow