2012-02-06 110 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;