2012-02-06 90 views
0

我要分配給該變量存儲到我所分配already.for例如將內存分配給已分配的變量?

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

我必須改變分配視圖控制器,用於上述的TabBar controller.so我不得不釋放 上述和分配相同的帶新控制器的tabbar。我怎麼才能釋放並分配 新的。如果我做了以下,給出崩潰。

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

但自變量必須deallocated在dealloc method.any幫助嗎?如果我喜歡以下也,它會崩潰?

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]; 

而且,釋放m_tabbarControllerdealloc方法。

2

首先發布它。假設你的合成屬性爲retain,實施將處理release爲您提供:

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

總之,除非實現某種形式的重新初始化類的方法,你可以不依賴於某種方式重新初始化一個實例。

如果這是一個UIViewController,只需創建一個新的UIViewController,因爲您需要了解很多關於實現,所有子類和所有成員/ ivars以實現正確重新初始化。有時候你可以通過它的公共屬性來完成這個任務,有時你贏了;不能夠正確地重新初始化一個實例。

重新初始化的一個問題是,你的alloc可能不是什麼返回 - 你可能不知道你在哪種情況下專門處理什麼類型。對複雜類型進行適當,徹底的重新實現會增加很多實現(這也往往是傳遞性的)。

+0

設置屬性'nil'分配一個新值之前,完全是多餘的。 – omz 2012-02-06 05:03:04

+0

@omz不知道爲什麼我寫了= p謝謝/更新 – justin 2012-02-06 05:06:38

+0

@Justin,你的解決方案是絕對正確的。但我建議這種情況應該避免使用'autorelease'。代替使用'autorelease',在賦值給屬性後使用'release'。 – 2012-02-06 05:12:06

-1

[self.m_tabbarController release];會釋放m_tabbarControllerself所以

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

是精絕

+0

這很可能會導致內存泄漏。 – omz 2012-02-06 05:04:50

+0

@omz他可能已將'@ property'聲明爲'assign' ,.所以你可以猜測,如果他寫了'self.m_tabbarController = [[TabbarController alloc] init]就是'retain';'然後我假設他沒有保留它... – 2012-02-06 05:26:42

+0

我沒有看到聲明的要點一個屬性爲'assign',但保留其價值。 – omz 2012-02-06 05:43:21

0
self.m_tabbarController = nil; 
TabbarController *tempController = [[TabbarController alloc] init]; 
self.m_tabbarController = tempController; 
[tempController release]; 
tempController = nil;