Andrew는 메인 런 루프의 모든주기마다 자동 제국 풀이 배수 될 것이라는 주요 질문에 대답했습니다. 따라서 생성 된 모든 자동 제출 객체 viewDidLoad
메인 런 루프로 돌아갈 때 즉시 배수 될 수 있습니다. 그들은 확실히 "신청이 종료 될 때까지"유지되지 않을 것입니다.
그러나 우리는 조심해야합니다. 이러한 객체가 자동 제국 풀에 추가되고 있다고 가정합니다. 이 가정에 대한 몇 가지 경고 :
이름이 시작되지 않은 메소드에서 객체를 반환 할 때 과거 (및 ARC-MRC 상호 운용성에 여전히 필요). alloc
, new
, copy
, 또는 mutableCopy
, 이러한 객체는 자동 제출 풀이 배수 된 경우에만 거래되며 (즉, 런 루프로 다시 산출 할 때).
그러나 Arc는 자동 제출 풀의 필요성을 최소화하는 것에 대해 더 똑똑해졌습니다 ( http://rentzsch.tumblr.com/post/75082194868/arcs-fast-autorelease, 논의합니다 callerAcceptsFastAutorelease
, 이제 callerAcceptsOptimizedReturn
발병 prepareOptimizedReturn
), 그래서 당신은 종종 이것을 보지 못할 것입니다 autorelease
행동. 따라서 라이브러리와 발신자가 모두 ARC를 사용하는 경우 AutorELEASE 풀에 객체가 배치되지 않을 수 있지만 ARC는 필요하지 않은 경우 즉시 즉시 해제됩니다.
현대적인 아크 프로젝트를 사용하면 일반적으로 자동 제국 풀이 필요하지 않습니다. 그러나 어떤 특별한 경우에도 여전히 자동 제출 풀을 사용하면 혜택을 볼 수 있습니다. 아래의 사례 중 하나를 설명하겠습니다.
다음 코드를 고려하십시오.
#import "ViewController.h"
#import <sys/kdebug_signpost.h>
typedef enum : NSUInteger {
InnerLoop = 1,
MainLoop = 2
} MySignPostCodes;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"png"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
kdebug_signpost_start(MainLoop, 0, 0, 0, 1);
for (int j = 0; j < 500; i++) {
NSData *data = [NSData dataWithContentsOfURL:fileURL];
UIImage *image = [[UIImage alloc] initWithData:data];
NSLog(@"%p", NSStringFromCGSize(image.size)); // so it's not optimized out
[NSThread sleepForTimeInterval:0.01];
}
kdebug_signpost_end(MainLoop, 0, 0, 0, 1);
});
}
@end
다음 코드는 AutoreLease Pool에 50 만 개 객체를 추가하며, 이는 런 루프로 다시 양보 할 때만 배수됩니다.
이 경우 자동 수원 풀을 사용하여 높은 수상을 최소화 할 수 있습니다.
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"png"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
kdebug_signpost_start(MainLoop, 0, 0, 0, 1);
for (int j = 0; j < 5; j++) {
@autoreleasepool {
kdebug_signpost_start(InnerLoop, 0, 0, 0, 2);
for (long i = 0; i < 100; i++) {
NSData *data = [NSData dataWithContentsOfURL:fileURL];
UIImage *image = [[UIImage alloc] initWithData:data];
NSLog(@"%p", NSStringFromCGSize(image.size)); // so it's not optimized out
[NSThread sleepForTimeInterval:0.01];
}
kdebug_signpost_end(InnerLoop, 0, 0, 0, 2);
}
}
kdebug_signpost_end(MainLoop, 0, 0, 0, 1);
});
}
@end
결론, ARC를 사용하면 AutorELEASE 객체를 사용했을 때 항상 변수가 범위에서 벗어날 때 명시 적으로 공개 할 때 항상 분명하지는 않습니다. 악기의 동작을 검사하여 언제든지 확인할 수 있습니다.
제쳐두고, 나는 사용할 때 너무 많은 일반 메모리 관리 결론을 도출하는 것에 대해 조심할 것입니다. NSString
클래스는 최적화되었으며 항상 표준 메모리 관리 관행을 준수하지는 않습니다.