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

目标C中的自动释放和NSString

  •  0
  • Krumelur  · 技术社区  · 14 年前

    在my.h中:

    NSString *sAStringMember;
    

    -(void) createAString
    {
     NSString *sAString = [NSString stringWithString:[dummyCode...get String ffrom some input field for instance]];
     sAStringMember = sAString;
    }
    

    几个简短的问题:

    1. 如果上述假设是正确的,那么在将sAString分配给sAString之前释放sAStringMember并保留它是一种选择吗?

    2. 我想最好是用“copy”把sAString复制到sAStringMember?

    2 回复  |  直到 14 年前
        1
  •  2
  •   kennytm    14 年前

    (1) 是的。
    (3) 或者 -retain -copy

    最好是使用声明的属性。

    @interface Foo : ... {
      NSString* sAStringMember;
    }
    @property(copy) NSString* sAStringMember;   // or retain.
    @end
    ...
    @implementation Foo
    @synthesize sAStringMember;
    ...
    -(void) createAString {
      self.sAStringMember = [dummyCode...get String ffrom some input field for instance];
    }
    -(void)dealloc {
      ...
      [sAStringMember release];
      [super dealloc];
    }
    @end
    

        2
  •  0
  •   Lothar    14 年前

    是的,如果你从其他地方保留指向某个对象的指针并保留它,你就必须复制或保留它。保留是首选,除非您想修改它,因为它不分配额外的内存,而且速度更快。

    在许多书中,您可以看到它将在处理下一个GUI事件时发生,但这不是确定的。在函数调用序列中,每个函数都可以打开和关闭自己的自动释放池。

    如果一个函数做了很多工作,它可以简单地创建它的autorelease池,并随时释放autorelease注册的对象。