代码之家  ›  专栏  ›  技术社区  ›  typeoneerror

局部变量赋值与直接赋值;属性和内存

  •  2
  • typeoneerror  · 技术社区  · 16 年前

    HomeScreenBtns *localHomeScreenBtns = [[HomeScreenBtns alloc] init];
    self.homeScreenBtns = localHomeScreenBtns;
    [localHomeScreenBtns release];
    

    还有这个:

    self.homeScreenBtns = [[HomeScreenBtns alloc] init];
    

    @property (nonatomic, retain) HomeScreenBtns *homeScreenBtns;
    

    我正准备向应用商店提交我的应用程序,所以我处于完全优化/QA模式。

    3 回复  |  直到 16 年前
        1
  •  2
  •   regulus6633    16 年前

    你不能这样做:

    self.homeScreenBtns = [[HomeScreenBtns alloc] init];
    

    因为当您[[HomeScreenBtns alloc]init]使用alloc创建一个对象时,该对象的保留计数为1。当您将该对象设置为HomeScreenBtns时,它的保留计数为2,因为HomeScreenBtns也保留该对象。因此,对象的retain计数永远不会返回0,因为惟一的release语句在homeScreenBtns的setter方法中。这样你就泄露了记忆。如果您想在一条语句中完成,而不是使用列出的第一种方式,您可以使用:

    self.homeScreenBtns = [[[HomeScreenBtns alloc] init] autorelease];
    
        2
  •  5
  •   bbum    16 年前

    @property (nonatomic,retain) HomeScreenBtns *homeScreenBtns;
    
    1. HomeScreenBtns*本地HomeScreenBtns
    2. 自我保护=
    3. [localHomeScreenBtns发布];

    则(1)表示 retain . (2) 意味着一秒钟 在由(1)创建的本地范围中。

    如果你不这样做,你最终会泄密的。

    这些都记录在 memory management guide.

        3
  •  1
  •   drekka    16 年前

    正如内存管理指南所说,如果您创建了某个对象的实例,则必须管理并释放它。

     ...allocate]init];
    

    如果你说你一直在写代码,分配一个类的实例,并在同一行设置一个属性,你将有一个内存泄漏。。。你的程序会崩溃。。。在第一次之后。。。减速。。。向下。。。。。。。。。。。。。。。。同时。。。。。使用………up………memo。。。。。。。。。。。。。