iOS의 retainCount
이 개념은 명확하고 명확하지만 두 단락의 코드를 살펴보자.
NSNumber *number = [NSNumber numberWithInt:1];
NSLog(@"retainCount = %lu",[number retainCount]);
이 코드의 운행 결과는 무엇입니까?
NSString *string = [NSString stringWithFormat:@"foo"];
NSLog(@"retainCount = %lu", [string retainCount]);
이 부분은요?
Xcode 5.0, ARC가 종료된 상태에서 실행한 결과:
2014-01-13 22:08:13.217 blockTest[2732:303] retainCount = 9223372036854775807
2014-01-13 22:08:13.218 BlockTest[2732:303] retain Count=1 이거 의외네요. 2단은 예상에 맞았는데 1단은 약간 안경이 떨어졌어요.
공식 문서를 찾아보니 첫마디가 "Do not use this method."뒤에 설명한 바와 같이 Autorelease pool의 존재로 인해 메모리에 대한 관리가 상당히 복잡할 수 있기 때문에retain Count는 메모리를 디버깅할 때의 근거로 사용할 수 없다.이렇게 하면 첫 번째 단락의 결과에 대해 이해할 수 있다. 아마도 시스템이 이 특수한 대상에 대해 특수한 처리를 한 것 같다(framework 안에 이미 이 대상을 만들었을지도 모른다). 그래서 우리는 매우 의외의 결과를 얻었다.
아래의 코드를 생각해 보면 좀 무섭다.
while ([a retainCount] > 0) {
[a release];
}
운행 결과가 정확하다면 얼마나 행운의 한 사람입니까!그러나 메모리에 대한 생각은 코드를 보면 더 진일보할 수 있다.
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic, retain) NSString *name;
@property(nonatomic, assign) NSInteger age;
@end
@implementation Person
- (id)init
{
self = [super init];
if (self) {
self.name = @"name";
self.age = 20;
}
return self;
}
- (void)dealloc
{
NSLog(@"dealloc");
[super dealloc];
}
@end
int main(int argc, const char * argv[])
{
Person *per1 = [[Person alloc] init];
//NSLog(@"retainCount = %lu -- 0",[per1 retainCount]);
[per1 release];
per1.age = 22;
NSLog(@"retainCount = %lu -- 1, age = %ld",[per1 retainCount], per1.age);
//[per1 retain];
//per1.age = 23;
//NSLog(@"retainCount = %lu -- 2, age = %ld",[per1 retainCount], per1.age);
return 0;
}
이 코드의 운행 결과는 의외로 다음과 같다.2014-01-13 22:17:11.619 blockTest[2758:303] dealloc
2014-01-13 22:17:11.621 BlockTest[2758:303] retainCount = 1-1,age=22http://www.cocoachina.com/ask/questions/show/106777#36483개인적으로는 대상이 확실히 소각되었다고 추측합니다. dealloc가 모두 호출되었지만 메모리에 데이터가 여전히 존재합니다. 즉각 인쇄하는 것은 내용이 존재합니다.retainCount는 0이 아닙니다. 대상이 소각되었어도 이 값은 0보다 클 수 있음을 설명할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.