【问题标题】:Does NSStringFromCGPoint return an autoreleased object?NSStringFromCGPoint 是否返回一个自动释放的对象?
【发布时间】:2012-03-10 22:00:45
【问题描述】:

问题 #1 NSStringFromCGPoint() 会返回自动释放对象还是需要释放该对象?

问题 #2 当您拥有房产时:@property (nonatomic, retain) NSString *someString; 你这样设置:self.someString = [[[NSString alloc] initWithString:@"Something"] autorelease];

这是:

[someString release];
someString = nil;

等于

self.someString = nil;

【问题讨论】:

    标签: iphone memory


    【解决方案1】:
    1. 我没有专门检查过那个,但按照惯例,这些函数会返回自动释放的对象。您可以通过设置一个最小的非 ARC 项目并调用 -retainCount 来测试您从该功能中得到的东西,但我不确定。 (一般来说,retainCount 不是你想使用的东西。)

    2. 是的。合成的 setter 看起来像:

      - (void)setSomeString:(NSString *)string
      {
          if (string != someString) {
              [someString release];
          }
          someString = [string retain];
      }
      

    因此,无论您是显式调用它还是使用点表示法,旧值都会被释放(并且底层 ivar 会设置为 nil 或您传入的任何值)。

    另外,我不确定您是否只是为了一个随机示例而这样做,但您不必在内存管理代码中包装字符串文字以将其传递给属性访问器。 (即self.someString = @"Something" 可以。)

    【讨论】:

    • Never use retainCount。绝不。曾经。永远不能。独角兽会哭,小猫会受伤。不要这样做。
    • 这只是一个例子,谢谢你的明确回答,我接受了。
    • 实际上,我猜有更好的方法来查看函数返回的对象是否是自动释放的,以防您不确定是否要信任约定。您可以将该函数调用放在它自己的小自动释放池中,然后测试指针。如果它仍然存在,则说明您有一个需要释放的对象……如果您崩溃,则说明该对象已自动释放。
    • 不,实际上您应该只查看内存管理指南并阅读哪些关键字表示非自动释放对象。
    • 您不能使用retainCount 来测试autorelease。 @rickster 的建议也不会奏效;当消息释放的实例未定义且内存未在释放时修改时的行为(同样,某些对象永远不会被释放)。
    【解决方案2】:

    调用是否包含术语“new”、“alloc”、“copy”或“create”?如果不是,您将返回一个不属于您的对象(您可以假设它是自动释放的,或者引用在其他地方拥有)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2011-12-18
      • 2011-06-23
      相关资源
      最近更新 更多