alloc, init,retain,release와 dealloc의 차이를 구별하다

5079 단어
1.alloc는 생성 변수이고 dealloc는 방출 변수이며,retain은 계수 더하기 1이며,release는 계수 감소 1이다. 이름alloc이나new로 시작하거나 이름에 포함된copy 방법(예를 들어alloc,newObject 또는mutableCopy)으로 대상을 만들면 이 대상의 소유권을 얻는다.또는 대상에게 retain 메시지를 보내면 대상의 소유권을 얻을 수 있습니다.방출release 또는 자동 방출autorelease을 사용하여 대상의 소유권을 방출할 수 있습니다.자동 방출autorelease은 방출release 메시지를 보낼 것이라는 뜻이다.Objective-C에는 newdelete 이 두 키워드가 없다(new는 하나의 함수로 볼 수 있다. 즉alloc+init)이다.그들은 실제로allocreleas로 대체되었다.allocdealloc의 의미와 반대로 alloc는 창설 변수이고 dealloc는 방출 변수이다.retain에 대응releas, 대상을 보류하고 호출 후 변수의 계수+1.단지 이렇게 하면 뚜렷하지 않을 수도 있다. 다음은 함께 예를 보자.
    -(void)setName:(NSString *)name {
            [name retain];
            [myName release];
            myName = name;
    }

다음은 설명을 드리겠습니다.사용자가 이 함수를 호출할 때 메모리 관리에 주의를 기울였기 때문에 다음과 같은 코드를 조심스럽게 썼다.
    NSSting*newName = [[NSSting alloc]initWithString:@"Jone"];
    [aClass setName:newName];
    [newName release];
newName의 계수가 어떻게 변했는지 봅시다.먼저 그는 alloccount= 1라고 생각했다.그리고 setName에서.그것의 등retain,count = 2;마지막으로 사용자 스스로 석방newName,count = 1,myName�newName를 가리켰다.이것도 왜 [my Name release]를 호출해야 하는지 설명한다.myName에 새 값을 부여할 때 이전 변수를 풀어야 합니다.retain 이후 직접dealloc 대상 계수기가 방출되지 않았다.allocrelease를 조합해서 사용해야 한다. 왜냐하면 alloc 이 함수가 호출된 후에 변수가 호출된 후에 변수의 계수가 +1이기 때문이다.그래서 alloc를 호출한 후에 반드시 호출해야 한다release.또한 release의 변수가 있는 후에도 그 값이 유효하기 때문에 alloc를 호출한 후에 대응하는 release를 반드시 호출해야 한다.또한 release의 변수 이후에도 그 값은 유효하기 때문에 뒤에 있는 것이 좋다var = nil.

2. 할당 프로세스(alloc 및 init...)대상의 메모리 분배를 진행할 뿐만 아니라, 그것의isa 실례 변수와 데이터 초기화를 유지해야 한다


대상을 분배할 때Cocoa 진행되는 일부 작업은'분배'라는 용어로 알 수 있다.Cocoa는 응용 프로그램의 메모리 영역에서 대상의 실례 변수로 그들의 유형과 순서를 포함하고 이러한 정보는 대상의 클래스에 의해 정의된다.대상을 분배하기 위해서는 대상의 클래스에 alloc 또는 allocWithZone: 메시지를 보내야 한다.메시지의 반환값에서 '생적' (초기화되지 않은) 클래스의 실례를 얻을 수 있습니다.alloc 방법은 프로그램의 기본 메모리 영역을 사용합니다.구역은 페이지에 따라 정렬된 메모리 구역으로 응용 프로그램이 분배한 대상과 데이터를 저장하는 데 사용된다.메모리를 분배하는 것 외에 코코아의 분배(allcoation) 메시지는 다른 중요한 작업도 진행한다. 1. 대상의 유지수를 1("Cocoa 대상의 생명주기"부분에서 말한 바와 같이)로 설정한다.2. 초기화 대상의isa 실례 변수가 대상의 클래스를 가리키도록 한다.대상 클래스는 클래스 정의에 따라 컴파일된 운동 시 대상 3으로 다른 모든 실례 변수를 0(또는 0과 같은 유형의 nil,NULL와 0.0)으로 초기화한다.대상의 isa 실례 변수는 NSObject에서 계승된 것이기 때문에 모든 코코아 대상이 있다.(클래스와 실례) 네트워크에 있습니다.그 결과 대상은 자신이 필요로 하는 모든 운행 정보를 찾을 수 있다. 예를 들어 다른 대상이 계승 차원에서의 위치, 그들이 따르는 협의, 그리고 메시지에 응답할 때 실행할 수 있는 방법이 실현될 수 있는 위치를 찾을 수 있다.한 마디로 하면 분배 과정은 대상의 메모리 분배를 진행할 뿐만 아니라 대상의 두 가지 매우 중요한 속성, 즉 그의 isa 실례 변수와 유지수를 초기화한다.그것은 또한 모든 남은 실례 변수를 0으로 설정했다.그러나 분배가 완료된 대상은 사용할 수 없습니다. init와 같은 초기화 방법을 사용해서 대상 자체의 초기화를 진행해야 사용할 수 있는 대상을 되돌릴 수 있습니다.

대상이 값을 부여할 때retian 모드가 아닌 autorelease를 사용하십시오


새로운 임시 대상을 만들 때, 이 방법의 뒷줄에 쓰지 않고 같은 줄 코드에 autorelease 설정합니다.이렇게 하면 약간의 지연을 초래할 수 있지만 누가 부주의로 release를 제거하거나 release 이전return에 발생한 메모리 유출을 피할 수 있다. 아래와 같다.
//AVOID (unless you have a compelling PerforMance reason)
MyController *controller  =[[MyController alloc]init];
//...code here that might return...
[controller release];
//BETTER
MyController *controller = [[[MyController alloc]init]autorelease];

대상이 값을 부여할 때 autorelease 모드가 아닌 retian 모드를 사용하도록 한다.혁신적인 대상에게 변수를 부여할 때 가장 먼저 해야 할 일은 원래의 변수가 가리키는 대상을 방출하여 메모리 유출을 방지하는 것이다.여기에도 이 일을 하는 정확한 방법이 매우 많다.선택autorelease은 실수하는 경향이 더 강하지 않기 때문이다.조심해라. 밀집된 순환 속에서 autorelease 연못을 빨리 채울 수 있을 뿐만 아니라, 효율도 확실히 떨어지지만, 비교해 보면 받아들일 수 있다.
- (void)setFoo:(CMFoo *)aFoo{
        [foo_autorelease];// Wo't dealloc if|foo_|==|aFoo|
        foo_ = [aFoo retain]; 

}
autorelease를 사용하여 지연release을 보냅니다.전형적인 사용 장면: 함수가 한 대상을 되돌릴 때.예를 들어, 다음과 같이 fullName을 구현할 수 있습니다.
-(NSString *)fullName = {
    NSSting *sting  = [[[NSSting alloc]initWithFormat:@"%@,%@", self.firstName, self.lastName]autorelease];
    return sting;
}

위쪽은 전형적인 장면이다. 대상의 소유권을 포기하고 싶지만 스팅이 소각되기 전에 반환값을 사용하도록 호출하고 싶다.다음과 같은 이점을 얻을 수도 있습니다.
-(NSSting)fullName {
NSSting *sting = [NSString stingWithFormat:@"%@,%@", self.firstName, self.lastName];
return sting;
}

요점


(1)alloc는 창설 변수, dealloc는 방출 변수, retain는 계수 +1, release는 -1.(2) 분배 과정(alloc와 init...)대상의 메모리 분배를 진행할 뿐만 아니라, 대상의isa 실례 변수와 유지수를 초기화합니다.(3) 대상이 값을 부여할 때 autorelease 모드가 아닌 retain 모드를 사용하도록 한다.

좋은 웹페이지 즐겨찾기