Objective-C 2.0 메모리 관리

4789 단어
Objective-C 2.0은 쓰레기 수집을 지원하지만 아이폰 OS에서는 사용할 수 없다.그래서 우리는 스스로 메모리를 관리해야 한다.Objective-C의 메모리 관리 방식과 인용 계수를 사용하는 방식은 대상에 하나의 계수기가 있고 인용 대상은 한 번, 계수기는 하나를 더하며 계수기가 0일 때 그 대상의 메모리는 방출된다는 것이다.
대상의 실례를 만들 때 (init,alloc) 응용 계수가 1을 더하고, 실행 과정에서 다른 대상이 이 대상을 필요로 한다면 (retain) 으로 인용해야 하며, 이 대상의 응용 계수기는 1을 추가합니다.대상이 필요 없을 때 (release) 로 방출하고, 인용계수기를 1로 줄이고, 계수기가 0일 때 대상 메모리를 방출합니다.

      
      
      
      
  1. init,alloc -   +1  
  2. retain -   +1  
  3. release -   -1 

또한retain,release를 사용하지 않으면 (autorelease)를 사용하여 대상을 자동으로 방출할 수 있습니다.
용기.
Objective-C의 컨테이너는 주로 다음 세 가지가 있습니다.
배열
자전
Set
컨테이너에 추가된 내용은 int나 float를 직접 사용할 수 없으며 NSNumber 등 봉인 클래스를 통해 이루어져야 한다.Objective-C 2.0에서는 컨테이너의 요소에 순차적으로 액세스하기 위해 반복자(Enumerator)를 사용할 수 있습니다.
Notification
Notification은 메시지 알림의 기능입니다.구체적으로 NSNotificationCenter 클래스를 사용합니다.알림을 받아야 하는 대상, 방법, 이벤트를 이 클래스에 등록합니다.
아카이빙
아카이브란 객체의 메모리 레이아웃을 파일 시스템에 있는 그대로 저장하는 것입니다.파일의 데이터로 생성되는 동일한 객체를 Unachive라고 합니다.아이폰SDK에서는 NSKeyedArchiver와 NSKeyedUnarchiver 클래스를 사용하여 구현됩니다.
일반적으로 프로그램이 끝날 때 현재 상태를 저장하고 다시 시작할 때 Unachive는 방금 종료했을 때의 상태로 돌아간다.다음 예는 다음과 같습니다.

      
      
      
      
  1. // MyKeyedArchiver.h  
  2. #import   
  3. @interface NSKeyedArchiver (MyKeyedArchiver)  
  4. - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address;  
  5. @end  
  6. #import "MyKeyedArchiver.h"  
  7. @implementation NSKeyedArchiver (MyKeyedArchiver)  
  8. - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address  
  9. {  
  10. NSMutableData *datas = [NSMutableData data];  
  11. NSArchiver *arch = [[NSArchiver alloc] initForWritingWithMutableData:datas];  
  12. [arch encodeValueOfObjCType:valueType  
  13. at:address];  
  14. [self encodeObject:[NSData dataWithData:datas]];  
  15. [arch release];  
  16. }  
  17. @end  
  18. // MyKeyedUnarchiver.h  
  19. #import   
  20. @interface NSKeyedUnarchiver (MyKeyedUnarchiver)  
  21. - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data;  
  22. @end  
  23. #import "MyKeyedUnarchiver.h"  
  24. @implementation NSKeyedUnarchiver (MyKeyedUnarchiver)  
  25. - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data  
  26. {  
  27. NSData *datas = [self decodeObject];  
  28. NSUnarchiver *unarch = [[NSUnarchiver alloc] initForReadingWithData:datas];  
  29. [unarch decodeValueOfObjCType:valueType  
  30. at:data];  
  31. [unarch release];  
  32. }  
  33. @end 

좋은 웹페이지 즐겨찾기