【问题标题】:Differences in return object pointer?返回对象指针的区别?
【发布时间】:2009-09-02 16:16:08
【问题描述】:

谁能解释一下这两者之间的区别,第一个来自允许 xcode 自动生成声明,最后一个来自 Aaron Hillegass 的“Cocoa Programming”中的一个示例。

- (NSString*)planetName {
    return [[planetName retain] autorelease];
}

.

- (NSString*)planetName {
    return planetName;
}

我只是好奇发生了什么,我的理解是该方法返回一个指向 nil 或现有字符串对象的指针。我不明白保留然后添加到自动释放池的原因?

【问题讨论】:

    标签: objective-c xcode memory


    【解决方案1】:

    考虑:

    NSString *planetName = [myPlanet planetName];
    [myPlanet setPlanetName: @"Bob"];
    [planetName length];
    

    没有[[planetName retain] autorelease],上面很可能会崩溃。

    retain/autorelease 将对象放入当前线程的自动释放池中。这有效地保证了对象将保持有效,直到池被耗尽,这通常是在当前事件(用户事件、计时器触发等)完成处理之后。

    (1) 使用@property 和@synthesize。它会为您生成正确的 getter/setter。

    (2) 阅读 Cocoa 内存管理指南。它很好地回答了所有这些问题。

    http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

    【讨论】:

      【解决方案2】:

      在这两种情况下,是的,它们都返回指向nil 或字符串对象的指针。

      不同之处在于第一个代码块处理内存管理,第二个不处理。第二个代码块假设您在类实例中的其他位置管理planetName,而在第一个代码块中,Apple 尽可能保守地防止内存泄漏。通过将内存放入当前的自动释放池中,它将与池一起销毁。

      我的建议是坚持后一种情况,并且在管理您自己的对象实例方面比 XCode 为您自动生成的对象更明智。

      【讨论】:

      • 遵循第二种模式但不理解为什么会导致那些刚接触 Cocoa 的人神秘崩溃。遵循第一种模式 [防御性],然后再进行优化可能会更有成效。
      • 如果我向执行 [planetName release] 的类添加了一个 dealloc 方法,这是否会构成“更明智的内存管理”并允许我安全地使用较短的“return planetName;”?我已经有了,我想我可能会感到困惑和过度管理,我知道同样糟糕。
      • 基本理念是“对象所有权”——您想选择一个“拥有”planetName 的对象并在该对象中跟踪其保留/释放调用。我会推荐 bbum 的关于内存管理的链接——它可能需要一些时间才能通过,但它是一个很好的资源,会带你走很长的路。
      • 这就是你需要阅读内存管理指南的原因;是否使用retain/autorelease与dealloc完全无关。
      • 我只提到了dealloc,因为我认为如果我没有在“getter”中标记planetName 以释放,那么当我最终释放它的父对象时,我需要正确处理它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2017-12-26
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2020-11-01
      相关资源
      最近更新 更多