OC의 메모리 유출

3535 단어

하나.메모리 유출이란?


한 대상이 더 이상 사용하지 않지만 이 대상은 소각되지 않고 공간이 방출되지 않으면 이것을 메모리 유출이라고 한다.

둘.관리의 원칙


더 이상 사용하지 않는 대상은 반드시 소각하고 메모리를 방출해야 한다.Xcode 5.0 이전에 프로그래머가 수동으로 메모리를 방출해야 했다. 그런 작업량은 너무 많고 쌓인 구역에서 어떻게 일을 하는지 손금 보듯 잘 알아야 한다. 그런 작업 효율은 높지 않다.그럼 Xcode 5.0 이후에 우리는 걱정할 필요가 없다. 프로그램의 기능을 직접 강화하면 효율을 더욱 높일 수 있다.그럼 Xcode 5.0 전에 어떻게 작동했을까요?우리 먼저 코드를 봅시다.
      
Person *per = [[Person alloc]init];

Computer *computer = [[Computer alloc] init];
그럼 저는 먼저 Xcode 5를 말씀드리고 싶습니다.0 전에 프로그래머가 어떻게 풀었는지.우선, 메모리에서 계수기는 1을 더하거나 줄이는 작용을 한다.위의 코드는 대상을 만들 때 카운터가 0에서 1로 추가된 것이다.그 다음은 바로 아래의 코드입니다. 계수기를 더하거나 줄일 수도 있습니다.
  
//[computer retain];// 1
//[counter release];// 1
그리고release를 만날 때마다 1.그리고 다음 코드를 호출합니다.
   
-(void)dealloc{
    
 ;   

}

물론 마지막으로 다음 프로그램을 만났을 때 완전히 풀릴 것이다.
 @autoreleasepool {

 ;
}

위의 메모리 유출은 Xcode 5 입니다.0 버전에서 수동으로 하는 일은 Xcode 5.0 이후에는 프로그래머가 수동으로 방출할 필요가 없습니다. 이때 Xcode는 우리가 직접 이런 일을 해결할 수 있도록 도와줍니다.그럼 이제 좋은 방법을 알려드릴게요. 우리가 수동으로 관리해도 두렵지 않아요.나도'메모리 유출 삼자경 해결'이라고 부른다.
    
// , retain.
// , release.
// retain, release.
쉽게 알아들을 수 있지 않나요? 이 세 가지만 기억하면 일반적인 문제를 해결할 수 있어요.

셋.순환 인용에서 발생하는 메모리 유출 문제를 해결합니다.


낡은 규칙, 무엇이 순환 메모리 유출입니까?같은 통속점은 한 대상에 다른 대상을 정의하는 지침이 있고 그들 사이에 서로 가리키는 방향이 존재하기 때문에 강한 지침과 약한 지침이 역할을 발휘할 때 메모리의 유출을 초래할 수 있다.이것은 내가 이해한 것이다.그렇다면 도대체 약지침과 강지침은 무엇일까?
   
//__strong; 
//__weak; 
이 두 가지가 바로 강지침과 약지침의 표시 방식이다.두 대상 사이에 강과 약이 다른 바늘이 있을 때만 메모리를 방출할 수 있다.우리 직접 코드를 봅시다.
#import <Foundation/Foundation.h>

@class Computer;// 

@interface Person : NSObject

@property int age;// 

@property (nonatomic,weak) Computer *cp;

@end

이것은 Person의 헤더 파일을 정의한 것이다.
#import <Foundation/Foundation.h>
#import "Computer.h"
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // per
         __strong Person *per = [[Person alloc]init];
        // computer
         __strong Computer *computer = [[Computer alloc] init];
        
        per.cp = computer;// 
        
        computer.per = per;// 
    }
    return 0;
}
그리고 면의 마지막 부분,main 함수.
// , , set/get 
@property(nonatomic,strong) Person *per;
그 다음에 두 함수에 각각 다른 강지침과 약지침이 존재해야만 그들의 역할을 발휘할 수 있다.그럼 이 코드가 메모리에서 어떻게 가리키는지 봅시다.사진을 올릴 수 없기 때문에, 우리 여기에서 나는 문자로 모두에게 묘사해 주겠다.
Person 객체
Computer 포인터 <----------------*per
                                    *cp
                                    
*cp는 *per를 가리킵니다.
*per가 *cp를 가리키는 이 두 개의 화살표는 상반된 화살표가 있다
Computer 객체
Person 포인터<---------------*컴퓨터
                                    *per
프로그램이return0 위에 있는 괄호를 실행하면 *per와 *컴퓨터가 방출되고, 둘을 가리키는 화살표가 사라집니다. 즉 *per와 *컴퓨터가 방출됩니다.그러나 Person과 Computer 두 가지가 서로 지향하는 방향이 존재하기 때문에 강약 지침의 작용으로 인해 약한 지침이 있을 때 Computer의 이 대상을 지향할 가치가 있다. 가져가면 Person이 강한 지침이 가리키는 대상만 남는다. 그러면 Computer도 놓인다. 강한 지침 자신의 본질 때문에 대상이 Person이라는 공간을 가리키지 않기 때문에 그들 둘 다 메모리의 방출을 받을 수 있다.그러면 이것이 순환 사이의 메모리의 방출이다.그림의 원인으로 말미암아 잘 못했을 수도 있으니 널리 양해해 주시기 바랍니다.
아마도 일부분은 내가 아직 고려하지 못했을 것이다. 여기서 모두가 너에게 의견을 가지고 함께 교류할 수 있기를 바란다.

좋은 웹페이지 즐겨찾기