Objective-C Language
메모리 관리
수색…
자동 참조 횟수
자동 참조 카운팅 (ARC)을 사용하면 컴파일러에서 필요에 따라 retain
, release
및 autorelease
문을 삽입하므로 사용자가 직접 작성할 필요가 없습니다. 또한 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];
}
수동 참조 카운팅을 사용할 때 메모리 관리 규칙
이 규칙은 수동 참조 횟수를 사용하는 경우에만 적용됩니다!
자신이 만든 모든 객체를 소유하고 있습니다.
이름이
alloc
,new
,copy
또는mutableCopy
시작하는 메소드를 호출합니다. 예 :NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [NSObject new]; NSObject *object3 = [object2 copy];
즉, 이러한 개체를 완료 한 후에 개체를 릴리스해야 할 책임이 있습니다.
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; }
더 이상 필요하지 않으면 소유하고있는 물건의 소유권을 양도해야합니다
NSObject* object = [NSObject new]; // The retain count is now 1 [object performAction1]; // Now we are done with the object [object release]; // Release the object
소유하지 않은 물건에 대한 소유권을 포기해서는 안됩니다.
즉, 객체의 소유권을 가져 가지 않으면 해제하지 않습니다.
자동 회수 풀
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 블록을 사용할 필요가 있습니다. 때때로 소유하지 않는 객체가 있기 때문입니다 (네 번째 규칙이 항상 적용되는 것은 아닙니다).
자동 참조 계산은 규칙을 자동으로 처리하므로 사용자가 필요하지 않습니다.