返回对象指针的差异?

时间:2009-09-02 16:16:08

标签: objective-c xcode memory

有人可以解释这两者之间的区别,第一个是从允许xcode自动生成声明中获取的,最后一个是来自Aaron Hillegass的“可可编程”中的一个例子。

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

- (NSString*)planetName {
    return planetName;
}

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

2 个答案:

答案 0 :(得分:4)

考虑:

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

如果没有[[planetName retain] autorelease],上述内容很可能会崩溃。

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

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

(2)阅读Cocoa Memory Management指南。它很好地回答了所有这些问题。

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

答案 1 :(得分:0)

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

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

我的建议是坚持使用后一种情况,并且要管理自己的对象实例,而不是XCode为您自动生成的内容。