OC의 메모리 유출
하나.메모리 유출이란?
한 대상이 더 이상 사용하지 않지만 이 대상은 소각되지 않고 공간이 방출되지 않으면 이것을 메모리 유출이라고 한다.
둘.관리의 원칙
더 이상 사용하지 않는 대상은 반드시 소각하고 메모리를 방출해야 한다.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이라는 공간을 가리키지 않기 때문에 그들 둘 다 메모리의 방출을 받을 수 있다.그러면 이것이 순환 사이의 메모리의 방출이다.그림의 원인으로 말미암아 잘 못했을 수도 있으니 널리 양해해 주시기 바랍니다.
아마도 일부분은 내가 아직 고려하지 못했을 것이다. 여기서 모두가 너에게 의견을 가지고 함께 교류할 수 있기를 바란다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.