2009-08-16 2 views
9

인스턴스를 할당하고 내부적으로 보유하고있는 다른 것에 할당 된 직후에 인스턴스를 할당하는 경우가 많이 있습니다. 예를 들어autorelease 또는 release 직후에 더 나은가요?

, 나는 사람들이 우리를 잘 작성 후 오토 릴리즈보다는 출시와 함께 갈 것을 제안 들었습니다

 
UIView *view = [[UIView alloc] initWithFrame...]; 
[self addSubView:view]; 
[view release]; 

.

그래서 위가된다 :

 
UIView *view = [[[UIView alloc] initWithFrame...] autorelease]; 
[self addSubView:view]; 

가장 좋은 방법은 여기에 무엇입니까? 장점과 단점?

답변

14

대부분의 경우, 어느 쪽이든 상관 없습니다. -autorelease은 단순히 실행 루프의 현재 반복 끝에 객체가 해제된다는 것을 의미하므로 객체는 어느쪽으로 든 해제됩니다.

-autorelease을 사용할 때 가장 큰 이점은 메서드의 컨텍스트에서 개체의 수명에 대해 걱정할 필요가 없다는 것입니다. 마지막으로 사용한 후 여러 줄로 개체를 사용하여 나중에 작업하기를 원하는 경우에는 -release으로 전화를 옮길 염려가 없습니다. 당신이 당신의 방법에 임시 개체의 많은을 만드는 경우

-autorelease를 사용하여 대 눈에 띄는 차이를 만들 것입니다 -release를 사용하여 주요 인스턴스입니다.

이 방법이 끝나는 시간으로
- (void)someMethod { 
    NSUInteger i = 0; 
    while (i < 100000) { 
     id tempObject = [[[SomeClass alloc] init] autorelease]; 

     // Do something with tempObject 

     i++; 
    } 
} 

는, 당신은 100,000 개체가 해제되기를 기다리는 오토 릴리즈 풀에 앉아있어 예를 들어, 다음과 같은 방법을 고려한다. tempObject의 클래스에 따라, 이것은 데스크탑에서 주요한 문제 일 수도 있고 아닐 수도 있지만, 메모리가 제한된 iPhone의 경우 가장 확실합니다. 따라서 많은 임시 개체를 할당하는 경우 -autorelease에 실제로 -release을 사용해야합니다. 그러나, 많은/대부분의 사용을 위해, 당신은이 두 가지 사이의 큰 차이점을 보지 않을 것입니다.

+3

+1. autorelease는 성능 (일반적으로 비 - 대형 루프 코드의 숫자로 백업 된 경우는 드물다)보다 많은 flak를 얻습니다. 그러나 autorelease는 코드가 리팩터링 될 때 많은 누수를 줄여줍니다. 낮은 수준의 루틴에서는 더 큰 레벨의 큰 루프에서 호출 될지 여부를 알지 못하기 때문에 더 자주 릴리스를 사용합니다. 그래도 release를 사용하려고한다면, 변수가 여전히 범위 내에 있다면 즉시 변수를 nil로 설정해야합니다. 개체를 놓지는 않지만 포인터는 여전히 있습니다. –

5

나는 Matt Ball에 동의합니다. 다음과 같이

@interface UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame; 
@end 

@implementation UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame 
{ 
    UIView * newView = [[viewType alloc] initWithFrame:frame]; 
    [self addSubView:newView]; 
    return [newView autorelease]; 
} 
@end 

사용할 수 있습니다 :

UIView * view = [someView addNewSubviewOfType:[UIView class] 
             inFrame:someFrame]; 

그리고 심지어 작품이 빠른 범주를 쓸 편리 할 수 ​​있습니다, 당신은 자주 패턴을 사용하여 자신을 발견하는 경우 나 그냥 그를 추가하자 한 그들이있는 UIView에서 파생 된 같은 다른 유형과 : 가능하면

UIButton * button = [mainView addNewSubviewOfType:[UIButton class] 
              inFrame:buttonFrame]; 
4

나는 보통 -autorelease보다는 -release에 대한 이동합니다. 이것은 수년간의 경험을 바탕으로 다른 사람들의 Objective-C 코드를 디버깅하고 개선 한 것입니다. 사방에 autorelease를 사용하는 코드는 여분의 릴리즈가 잘못된 코드에서 멀리 떨어져 발생하기 때문에 객체가 과도하게 릴리스 될 때 디버그하기가 더 어려워집니다.

많은 사람들이 코코아 메모리 관리가 어떻게 작동하는지 이해하지 못하는 경우 autorelease를 사용하는 경우도 있습니다. 규칙을 배우고 API를 배우면 거의 자동으로 객체를 자동으로 가져올 필요가 없습니다.

마지막으로 부작용은 autorelease 동작이 필요하지 않으면 autorelease를 사용하면 불필요하게 프로그램에서 수행해야 할 추가 작업을 추가한다는 것입니다.

관련 문제