objective-c - 해제 - swift 메모리 관리




자동 릴리즈 된 오브젝트가 실제로 출시되는 시점은 언제입니까? (2)

예, 함수가 유효하고 retain / release / autorelease / copy에 올바른 코코아 규칙을 사용하여 객체를 반환합니다.

runloop에 대한 질문에 대답하기 위해 응용 프로그램의 main () 함수에서 UIApplicationMain ()을 호출합니다. 당신은 UIApplicationMain이 다음과 같이 보일 것이라고 상상할 수 있습니다 :

void int UIApplicationMain (int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName) {
    UIApplication *app = /* create app using principalClassName */;
    [app setDelegate:/* create delegate using delegateClassName */];
    while (![app shouldTerminate]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        event = [app getNextEvent];
        [app dispatchEvent:event];
        [pool drain];
    }
}

while 루프는 UIKit이 실제로 수행하는 루프와 유사하며 while 루프를 통과하는 각각의 이동은 runloop을 통한 이동과 같습니다. getNextEvent 함수는 이벤트가 발생하기를 기다리는 블록입니다. 모든 메서드는 일반적으로 dispatchEvent : 같은 것으로부터 호출됩니다. IBAction과 같은 메서드 중 하나에서 중단 점을 설정하고 이벤트를 처리하는 UIKit 메서드 및 runloop의 이름을 보려면 디버거 호출 스택을 맨 위로 살펴보십시오. 각 메소드는 while 루프 내에서 호출되기 때문에 객체에서 자동 렌더링을 호출 할 때마다 해당 객체가 실행 루프의 해당 외부 풀에 추가됩니다. 현재 이벤트가 디스패치되고 나면 풀이 비워지고 그 개체는 최종적으로 릴리스 메시지를 보냅니다.

한 마지막 메모. 자동 루프 풀이 여러 개있을 수 있습니다. 이벤트 풀의 끝에 항상있는 것은 아닙니다. 때로는 이벤트 루프를 통해 한 번에 수만 개의 객체를 할당 할 수 있습니다. 이러한 상황이 발생하면 autorelease 풀에있는 자동 릴리즈 된 객체의 수를 줄이기 위해 자체 메소드에 내부 자동 릴리즈 풀을 추가로 설정할 수 있습니다. 자동 해제 풀은 스택 할 수 있습니다.

나는 객관적으로 새로운 것인데, 나는 그것을 올바르게하기 위해 메모리 관리를 이해하려고 노력하고있다.

우수를 읽은 후
애플에 의해 코코아대한 메모리 관리 프로그래밍 가이드 내 유일한 관심사는 실제로 autoreleased 개체가 아이폰 / 아이팟 응용 프로그램에서 발표되었을 때입니다. 내 이해는 실행 루프 의 끝에 있습니다. 그러나 응용 프로그램에서 실행 루프를 정의하는 것은 무엇입니까?

그래서 다음 코드가 옳은지 궁금합니다. 객체를 가정합니다.

@implementation Test

- (NSString *) functionA {
    NSString *stringA;
    stringA = [[[NSString alloc] initWithString:@"Hello"] autorelease]
    return stringA;
}

- (NSString *) functionB {
    NSString *stringB;
    stringB = [self functionA];
    return stringB;
}

- (NSString *) functionC {
    NSString *stringC;
    stringC = [self functionB];
    return stringC;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString* p = [self functionC];
    NSLog(@"string is %@",p);
}

@end

이 코드가 유효합니까?

Apple text에서 functionA 에서 반환 된 NSString이 functionB 의 범위에서 유효하다는 것을 이해 합니다 . functionCviewDidLoad 에서 유효한지 확실하지 않습니다.

감사!


이 코드에는 아무런 문제가 없습니다. 예상대로 컴파일되고 실행됩니다.

functionA 에서 반환 된 NSString 객체는 스택을 따라 현재 추적중인 다음 사람 ( functionB )에게 전달되기 때문에 여전히 유효합니다.





autorelease