2012-02-06 3 views
0

는 I 변수를위한 메모리를 할당 할 내가 예 already.for 할당 된 어떤이미 할당 된 변수에 메모리를 할당합니까?

제가 상기 해제와 같은 할당이 상기 TabBar의의 controller.so 할당 뷰 컨트롤러를 변경해야
 self.m_tabbarController = [[TabbarController alloc] init]; 

새 컨트롤러가있는 tabbar. 내가 어떻게하면 새로운 것을 배포하고 할당 할 수 있습니까? 다음과 같이하면 충돌이 발생합니다.

if(self.m_tabbarController != nil) 
    { 
     [self.m_tabbarController release];  
    } 
      self.m_tabbarController = [[TabbarController alloc] init]; 

하지만 자기 변수가 나는 또한 다음과 같이한다면?, 그것은 충돌 제공하십시오의 dealloc의 method.any 도움말에서 deallcated해야합니까?

m_tabbarController = [[TabbarController alloc] init]; 
    [self.window addSubview:m_tabbarController ]; 
    [m_tabbarController release]; 

답변

0

보유 유형 속성이있는 m_tabbarController을 선언해야합니다.

이제 다음과 같이 코드를 수정 :

TabbarController *temp = [[TabbarController alloc] init]; 

self.m_tabbarController = temp; 

[temp release]; 

또한, dealloc 방법으로 m_tabbarController를 놓습니다.

2

먼저 출시하십시오. 당신의 합성 속성을 가정하면 구현이 당신을 위해 release를 처리, retain입니다 : 당신이 클래스의 재 초기화 방법의 어떤 종류를 구현하지 않는 한 짧은에서

self.m_tabbarController = [[[TabbarController alloc] init] autorelease]; 

, 당신은 인스턴스를 초기화 할 수있는 방법에 의존 할 수 없다.

UIViewController 인 경우 올바르게 구현을 다시 구현하려면 구현, 모든 하위 클래스 및 모든 멤버/ivars에 대해 많이 알아야하기 때문에 새로운 UIViewController을 새로 작성하십시오. 때로는 공용 속성을 통해이를 수행 할 수 있습니다. 인스턴스를 올바르게 다시 초기화 할 수없는 경우도 있습니다.

다시 초기화의 한 가지 문제는 alloc이 반환되지 않을 수 있으며 모든 경우에 특별히 처리 할 유형을 알지 못할 수도 있다는 것입니다. 복잡한 유형의 적절하고 철저한 재 구현은 많은 구현을 추가합니다 (과도기적 인 경향이 있음).

+0

절대적으로 괜찮 발표 할 예정 완전히 불필요. – omz

+0

@omz 왜 내가 쓴지 = p 감사/업데이트했습니다. – justin

+0

@Justin, 당신 해결책은 절대적으로 옳습니다. 그러나이 시나리오는'autorelease' 사용을 피해야한다고 제안합니다. 'autorelease'를 사용하는 대신에 속성에 값을 할당 한 후에'release'를 사용하십시오. –

-1

[self.m_tabbarController release];m_tabbarController하지 self 그래서

if(self.m_tabbarController != nil) 
    { 
     [self.m_tabbarController release];  
    } 
self.m_tabbarController = [[TabbarController alloc] init]; 

가 새 값을 할당하기 전에 nil``에 대한 속성을 설정

+0

메모리 누수가 발생할 가능성이 매우 높습니다. – omz

+0

@omz'@ property'를'assign'으로 선언했을 수도 있습니다. 그래서'self.m_tabbarController = [[TabbarController alloc] init];이라고 쓰면'retain'이라고 추측 할 수 있습니다. 그러면 그가 그걸 retaing하고 있다고 가정합니다 ... –

+0

선언의 요지가 보이지 않습니다. 속성을 '할당'하지만 그 값을 유지합니다. – omz

0
self.m_tabbarController = nil; 
TabbarController *tempController = [[TabbarController alloc] init]; 
self.m_tabbarController = tempController; 
[tempController release]; 
tempController = nil; 
관련 문제