alloc, init,retain,release와 dealloc의 차이를 구별하다
alloc
이나new
로 시작하거나 이름에 포함된copy
방법(예를 들어alloc,newObject 또는mutableCopy)으로 대상을 만들면 이 대상의 소유권을 얻는다.또는 대상에게 retain
메시지를 보내면 대상의 소유권을 얻을 수 있습니다.방출release
또는 자동 방출autorelease
을 사용하여 대상의 소유권을 방출할 수 있습니다.자동 방출autorelease
은 방출release
메시지를 보낼 것이라는 뜻이다.Objective-C에는 new
와 delete
이 두 키워드가 없다(new
는 하나의 함수로 볼 수 있다. 즉alloc
+init
)이다.그들은 실제로alloc
와releas
로 대체되었다.alloc
는 dealloc
의 의미와 반대로 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
의 계수가 어떻게 변했는지 봅시다.먼저 그는 alloc
count= 1
라고 생각했다.그리고 setName
에서.그것의 등retain
,count = 2
;마지막으로 사용자 스스로 석방newName
,count = 1
,myName
는 �newName
를 가리켰다.이것도 왜 [my Name release]를 호출해야 하는지 설명한다.myName에 새 값을 부여할 때 이전 변수를 풀어야 합니다.retain
이후 직접dealloc
대상 계수기가 방출되지 않았다.alloc
는 release
를 조합해서 사용해야 한다. 왜냐하면 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
모드를 사용하도록 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.