2010-07-22 4 views
1

아래 코드를 살펴보고 최선의 방법을 제안하십시오. 나는 그 코드가 정확한지를 확실히 말할 수 없다. 배열에 객체를 추가 할 때 보유 수를 얻나요? 두 번째 함수에서 로컬 변수 "mySubview"또는 원래 객체를 릴리스합니까?배열에 저장된 객체를 해제하는 방법은 무엇입니까?

// this is a class property 
    myArray = [[NSMutableArray alloc] init];  


    - (void)createSubview 
    { 
     UIView *mySubview = [[UIView alloc] init]; 
     [self addSubview:mySubview]; 


     [myArray addObject:mySubview]; 

    } 

    -(void)eventHandler:(NSNotification *) notification 
    { 
     UIView *mySubview = [notification object]; 

     [myArray removeObjectIdenticalTo:mySubview]; 

     [mySubview removeFromSuperview]; 
     [mySubview release]; 
    } 

답변

2
배열에 객체를 추가 할 때

는, 그들이 보유 수를 얻을 합니까?

예. 두번째 기능에

, I는 지역 변수 "mySubview"또는 원래 객체 해제입니까? UIView 클래스의 인스턴스 - 참조 -

UIView *mySubview;'는 포인터 인 로컬 변수 mySubview을 정의한다. Objective-C에는 "로컬 객체"또는 "스택 객체"와 같은 것이 없습니다 (블록에 대해서는 저장하지만이 질문의 범위를 벗어납니다). 전화 할 때

그래서, 아니, [mySubview release] 당신은 notification에 포함 UIView의 인스턴스에 -release을 보내고있다.

releasealloc에 의해 암시 된 retain의 균형을 맞추고 있습니다. 어느 것이 올바른 패턴이 아닙니다. 다음과 같이해야합니다 :

- (void)createSubview 
{ 
    UIView *mySubview = [[UIView alloc] init]; 
    [self addSubview:mySubview]; 
    [myArray addObject:mySubview]; 
    [mySubview release]; 
} 

-(void)eventHandler:(NSNotification *) notification 
{ 
    UIView *mySubview = [notification object]; 
    [myArray removeObjectIdenticalTo:mySubview]; 
    [mySubview removeFromSuperview]; 
} 

오, "클래스 속성"으로, 나는 "인스턴스 변수"라고 가정하고 있습니까?

+0

완벽 함, 내가 분명히해야 할 필요가있는 것입니다. 따라서 두 번째 함수에서 마지막 두 줄은 참조 횟수를 0으로 줄이고 원래 인스턴스는 메모리에서 해제됩니다. 맞습니까? – anna

+0

어쩌면 0으로 줄이고 그렇지 않을 수도 있습니다. 걱정할 필요가 없습니다. 걱정할 필요가있는 것은 모든 보유 (및 함축 된 보유)가 릴리스별로 균형을 유지하는지 확인하는 것입니다. 객체 또는 프레임 워크가 내부적으로 수행 할 수있는 것은 사용자가 제어 할 수없는 구현 세부 사항입니다. 나는. 보유 수는 델타에 불과하며 절대로 절대적이지 않습니다. 이 경우 모든 것이 균형을 이루기 때문에 코드가 정확합니다. – bbum

+0

아, 알겠습니다. 고맙습니다. – anna

관련 문제