有人可以解释这两者之间的区别,第一个是从允许xcode自动生成声明中获取的,最后一个是来自Aaron Hillegass的“可可编程”中的一个例子。
- (NSString*)planetName {
return [[planetName retain] autorelease];
}
- (NSString*)planetName {
return planetName;
}
我只是好奇发生了什么,我的理解是该方法返回一个指向nil或现有字符串对象的指针。我不明白保留然后添加到自动释放池的原因?
答案 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为您自动生成的内容。