_01_고성능 iOS 애플리케이션 개발 – 메모리 관리

2025 단어
  • 응용 프로그램에서 새로 만든 모든 라인은 전용 창고 공간을 가지고 있으며 라인의 최대 창고 공간은 매우 작습니다. 등급이 너무 깊으면 창고가 넘칠 수 있습니다.
  • 모든 프로세스의 모든 라인이 같은 무더기를 공유한다.
  • 앨범류 앱에서 모든 그림이 데이터 Source에 있으면 이 그룹은 매우 커서 높은 피크 메모리를 사용할 수 있다.사용자가 보기를 굴릴 때 그림을 바꾸거나 바꿀 수 있는 그룹의 크기를 고정할 수 있습니다.
  • A 방법은 대상을 만들고 a로 되돌아왔다. B 방법은 A 방법을 호출하고 B 방법은 a를 인용한다. 그러면 B 방법에서 a를 방출해서는 안 된다. B 방법에서 실체 대상을 만들지 않았기 때문에 B 방법에서release를 사용하지 말아야 한다.대상을 만들고 비alloc 방법에서 되돌릴 때 autorelease를 사용해야 합니다.이렇게 하면 대상이 석방되는 것을 보장할 수 있다.
  • 
    - (NSString *)address {
        NSString *ad = [[[NSString alloc] initWithString:@"  221B"] autorelease];
        return ad;
    }
    ...
    - (void)showPersonAddress:(Person *)p {
        NSString *address = [p address];
        NSLog(@"Person's Address: %@", address);
    }
    
    
  • autoreleasepool 블록을 직접 만드는 경우:
  • 임시 대상을 많이 만든 순환이 있을 때 순환에서 autoreleasepool을 사용하면 순환마다 메모리를 방출할 수 있다.순환 횟수가 많을 때 메모리에 대한 수요가 크게 떨어진다.
  • 자신이 만든 라인도 자신의 autoreleasepool을 만들어야 한다.

  • __weak: 강한 인용이 대상을 가리키지 않을 때 약한 인용은nil로 설정됩니다.
  • __unsafe__unretained: 강한 인용이 대상을 가리키지 않을 때 약한 인용은nil로 설정되지 않습니다.
  • 순환 인용 양방향 체인 테이블과 고리형 체인 테이블에도 순환 인용이 존재한다.이때 대상이 더 이상 사용되지 않을 경우 코드를 작성해 체인 테이블의 링크를 깨야 한다.
  • 스레드 및 타이머
  • - (void)startCountdown {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateFeed:) userInfo:nil repeats:YES];
    }
    
    - (void)dealloc {
        [self.timer invalidate];
    }
    

    위의 예에서 순환 인용이 발생한 것은 분명하다. [self.timer invalidate]가 실행될 때까지 timer는self에 대한 강한 인용을 취소할 수 있지만 순환 인용이 만들어졌기 때문에 이곳의 dealloc는 호출되지 않고 timer는 invalidate를 실행하지 않는다.그래서 청소를 할 수 있는 방법을 사용자 정의해야 합니다.이러한 정리 방법은 현재 페이지를 떠나서 되돌아오기를 눌렀을 때 호출할 수 있습니다.또 다른 정리 방안은 소지 관계를 여러 클래스에 분산시키는 것이다. 즉, 작업 클래스가 구체적인 동작을 수행하고, 소유자 클래스가 작업을 호출하는 것이다.taget을 작업 클래스로 설정하는 프록시와 유사합니다.
  • 관찰자 키값 관찰과 통지센터는 관찰 대상, 피관찰 대상과 상하문 대상의 강한 인용을 유지하지 않는다.대상을 계속 관찰하려면 그 대상에 대한 강력한 인용을 스스로 유지해야 한다.
  • 단일 예제와 전역 상태 대상을 대량으로 사용하는 것을 피한다.
  • 좋은 웹페이지 즐겨찾기