예, 아니오. 문자열 메모리를 해제하지만 가비지 수집 (메모리 관리가 아님) 환경에서이를 실행하면 해제 대신 drain을 사용하여 NSAutoreleasePool 개체를 메모리로 "누수"합니다. 이 "누수"는 GC 아래에 강력한 포인터가없는 다른 객체와 마찬가지로 NSAutoreleasePool의 인스턴스를 "도달 할 수 없음"으로 만들고 다음에 GC가 실행될 때 객체가 정리됩니다. 이는 다음을 호출 한 직후 일 수 있습니다 -drain
.
배수
가비지 수집 환경에서 마지막 수집 이후 할당 된 메모리가 현재 임계 값보다 큰 경우 가비지 수집을 트리거합니다. 그렇지 않으면 릴리스로 작동합니다. ... 가비지 수집 환경에서이 메서드는 궁극적으로 objc_collect_if_needed
.
그렇지 않으면 -release
비 GC에서 작동 하는 방식과 유사 합니다. 다른 사람이 언급했듯이, -release
GC 통해입니다 아래에있는 유일한 방법은 반드시 풀 제대로 작동 할 수 있도록 GC 아래에 어떤 조합이없는 -drain
, 그리고 -drain
비 GC에서 정확히 같은 작품 -release
이 아닌 GC에서, 거의 틀림없이 더 명확로서의 기능을 통신 잘.
"init"는 메모리를 할당하지 않고 객체 (생성자) 만 설정하기 때문에 "new, alloc 또는 init로 호출 된 모든 것"에는 "init"가 포함되지 않아야합니다 (하지만 "복사"는 포함되어야 함). 패션). 할당 된 객체를 받고 함수가 init 만 호출 한 경우 해제하지 않습니다.
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
그것은 이미 시작한 것보다 더 많은 메모리를 소비하지 않습니다 (init가 객체를 인스턴스화하지 않는다고 가정하지만 어쨌든 당신은 책임이 없습니다).