我已经阅读了Apple文档,断言我在正确地进行内存管理,但是提出了一些问题。
问题1:
他们显示此代码段为错误:
in obj implementation:
- (NSString *)method1 {
NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName];
return string;
}
... later ...
NString* myString = [obj method1];
NSLog("%@", myString);
[myString release];
Apple Doc:
You own the string returned by alloc, but lose the reference to it before you get a chance to relinquish ownership. Following the memory management rules, this would result in a memory leak, since the caller has no indication that they own the returned object.
因为我要释放先前分配的对象,所以没有内存泄漏,对吗?它们“丢失对它的引用”是什么意思?
仅关于Apple的内存管理建议是错误的(调用者没有表明他们拥有返回的对象),或者在技术上也是错误的吗?
问题2 :
这是关于自动释放对象的可用性:
示例代码:
in obj1 implementation:
- (NSString *)methodA {
NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName];
return [string autorelease];
}
in obj2 implementation:
- (NSString *)methodB:(NSString *)inputString {
NSLog("%@",inputString)
//*other call of methods with arg inputString*//
}
... later ...
NString* myString = [obj1 methodA];
[obj2 method2:myString];
在我的函数调用之后多远(或更深),由obj1返回的自动释放对象将可用。关于苹果公司的文档“自动发布对象将在其可变范围内可用”。我应该保留它吗?
最佳答案
Q1:仅关于Apple的内存管理建议是错误的(调用者没有表明他们拥有返回的对象),或者从技术上讲这也是错误的吗?
从技术上讲,这是正确的,因为在使用后释放myString
。但是,如果您遵循Apples guidelines for method naming(强烈建议),则这显然是错误的:
您拥有自己创建的任何对象。
使用名称以“alloc”或“new”开头或包含“copy”(例如alloc,newObject或mutableCopy)的方法“创建”对象。method1
不包含create
,alloc
,new
或copy
-因此,根据指导方针,调用者不拥有该对象,也不必释放它。
Q2:在我的函数调用之后多远(或更深),由obj1返回的自动释放对象将可用。关于苹果公司的文档“自动发布对象将在其可变范围内可用”。我应该保留它吗?
自动释放的对象将一直存在,直到耗尽最近的自动释放池为止,请参见Autorelease Pools:
自动释放池是NSAutoreleasePool的一个实例,该实例“包含”收到自动释放消息的其他对象。释放自动释放池后,它将向每个这些对象发送释放消息。一个对象可以多次放入一个自动释放池中,并且每次将其放入池中时都会收到释放消息。因此,向对象发送自动释放而不是释放,至少可以延长该对象的寿命,直到释放池本身为止(如果对象保留在中间,则对象可以生存更长的时间)。
...
Application Kit在事件周期(或事件循环迭代)的开始(例如鼠标按下事件)的开头自动创建一个池,并在结束时释放它,因此您的代码通常不必担心它们。但是,在三种情况下,您可以使用自己的自动释放池:
...
因此,如果在耗尽相应的自动释放池之后需要实例保持 Activity 状态,请保留它们以获取所有权。否则,通常只让它们由池处理。