OC 언어-메모리 관리

1 - 메모리 관리
1> 메모리 관리
메모리 관리는 iOS 개발에 있어 매우 중요하고 정수이다.메모리 관리를 습득하면 개발할 때 저장 공간을 정확하게 분배할 수 있다.
관리 범위: NSObject를 상속받은 모든 객체를 관리해야 합니다.기본 데이터 형식은 필요 없음 (int char double float struct enum)
2> 참조 카운터
모든 OC 대상은 자신의 인용 계수기를 가지고 있으며 대상이 인용된 횟수를 나타낸다
기본 카운터가 1인 새 대상이 0이 되면 삭제됩니다.개체에 dealloc 메시지가 자동으로 전송됩니다.
대상에게retain 메시지를 보내고 대상 계수기 + 1;
객체에 release 메시지, 객체 카운터 - 1;
현재 카운터 상태를 가져오려면retainCount을 개체에 전송합니다.
한마디:누구retain,누구release.누구alloc,new,누구release(outorelease).
대상이 삭제되었을 때 dealloc 방법을 사용합니다.
dealloc 메서드를 다시 작성하여 다음과 같은 요구 사항을 충족할 수 있습니다.
<span style="font-size:18px;">- (void)dealloc
{
    NSLog(@" ");
    [super dealloc];
}
</span>

좀비 대상: 차지하는 메모리가 회수된 대상입니다.
야생 지침: 좀비 대상(메모리를 사용할 수 없음)을 가리키는 지침.포인터 오류를 방지하기 위해 p = nil;[p release]는 빈 바늘에 메시지를 보내는 것이다.
빈 바늘: 아무것도 없는 바늘 (저장된 것은 nil, NULL, 0), 빈 바늘에release 메시지를 보내면 오류가 발생하지 않습니다.
3. 메모리 관리와 관련된 매개 변수
1>retain:release 이전 값,retain 새 값.
2>assign: (set 방법) 직접 값 부여 (기본값), @property (assign) int age (비oc 대상 형식에 적용)
3>copy:release 이전 값,copy 새 값.
4.set 메소드 메모리 관리
기본 데이터 유형은 메모리를 관리할 필요가 없습니다.
<span style="font-size:18px;">- (void)setAge:(int)age
{
    _age = age;
}
</span>

만약 어떤 대상을 교체하고 새로운 대상을 사용한다면, 대상을 교체하기 전에release를 한 번 해야 한다.
<span style="font-size:18px;">- (void)setCar:(Car *)car
{
    if(car != _car)//  
    {
        [_car release];//  
    }
    _age = [age retain];//  retain
}</span>

dealloc 방법의 코드 규범
1>반드시 [super dealloc]하고 마지막에 놓아야 한다.
2>(self) 현재 가지고 있는 다른 대상에 대해release 한 번 하기
- (void)dealloc
{//  , release 
    
    [_car release];
    
    NSLog(@"%d person ", _age);
    
    [super dealloc];
}

4.property.
1. 간단한 쓰기(객체 유형용):
책의 set 방법을 자동으로 생성합니다.release 이전 값,retain 새 값을 사용할 수 있습니다.
<span style="font-size:18px;">@property (retain) Book *book;
</span>

... 에 상당하다
- (void)setBook:(Book *)book
{
     if(_book != book)
    {
        [_book release];
        _book = [book retain];
    }
}

2. readonly 매개 변수와readwrite 매개 변수는 같은 유형에 속하며 하나만 쓸 수 있습니다.
//getter의 성명과 실현만 생성
<span style="font-size:18px;">@property (readonly) int height;
</span>

//setter와 Getter의 성명과 실현을 동시에 생성
<span style="font-size:18px;">@property(readwrite);</span>

3. 멀티스레드 관리
@nonatomic: 성능이 높아서 보통 이걸 사용합니다.
@atomic: 기본적으로 성능이 낮습니다.
4.setter 및 Getter 메서드의 이름
setter: setter의 이름을 결정했습니다. 뒤에 반드시 사칭이 있어야 합니다.
Getter: Getter의 이름을 결정합니다.보통 bool 형식에 사용됩니다.
<span style="font-size:18px;">@property (getter = abc,setter = setAbc:) age;
</span>

이런 방식은 일반적으로 bool에서 사용된다.
예를 들면 다음과 같습니다.
//bool 형식으로 돌아가는 방법 이름은 보통 is로 시작합니다
<span style="font-size:18px;">@property (getter = isRich) BOOL rich;
</span>

밖에서 이렇게 호출할 수 있습니다.
<span style="font-size:18px;">Person *p = [[Person alloc] init];
p.rich = YES;
BOOL b  = p.isRich;</span>

5.@class는 컴파일러에게만 알려줍니다. 이것은 클래스를 대표합니다.
개발 중 사용:.h 파일에서 @class로 클래스를 설명합니다.m에 클래스를 포함하는 모든 것을 #import로 표시합니다.
양쪽 순환의 인용 방법: 한쪽은retain을 사용하고 한쪽은assign을 사용합니다.
6.autorelease
autorelease 방법은 대상 자체를 되돌려주고 대상을 자동 방출 탱크에 넣습니다.
자동 방출 탱크를 소각할 때, 탱크 내부의 대상에 대해release 조작을 할 것이다.단지 Release일 뿐 대상을 소각하지는 않는다.
<span style="font-size:18px;">autorelease{
<span style="white-space:pre">	</span>Person *p =[ [ [Person alloc] init] autorelease];
}</span>

autorelease 방법을 호출한 후 대상의 계수기는 변하지 않습니다.
장점: 대상이 풀릴 때 신경 쓰지 않아도 되고, 언제 리서치를 호출할지 신경 쓰지 않아도 된다.
참고: 메모리가 많은 객체는 사용하지 마십시오.
autorelease에서 발생하는 코드가 번거롭기 때문에 autorelease를 되돌려 주는 클래스를 만들 수 있습니다.
<span style="font-size:18px;">+(id)person
{
    return [[[Person alloc] init] autorelease];
}
</span>

호출 직접:
<span style="font-size:18px;">Person *p = [Person person];</span>

치수를 지정하는 방법:
+(id)personWithAge:(int)age
{
    Person *p = [[[Person alloc] init] autorelease]
    p.age = age;//  age p age 
    return p; //  P
}

main 함수에서 한 줄에 직접 값을 부여할 수 있습니다.
p라는 대상에서 대표하는 나이에 100을 넣으세요.
Person *p = [Person personWithAge:100];

좋은 웹페이지 즐겨찾기