我已经阅读了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不包含createallocnewcopy-因此,根据指导方针,调用者不拥有该对象,也不必释放它。

Q2:在我的函数调用之后多远(或更深),由obj1返回的自动释放对象将可用。关于苹果公司的文档“自动发布对象将在其可变范围内可用”。我应该保留它吗?

自动释放的对象将一直存在,直到耗尽最近的自动释放池为止,请参见Autorelease Pools:

自动释放池是NSAutoreleasePool的一个实例,该实例“包含”收到自动释放消息的其他对象。释放自动释放池后,它将向每个这些对象发送释放消息。一个对象可以多次放入一个自动释放池中,并且每次将其放入池中时都会收到释放消息。因此,向对象发送自动释放而不是释放,至少可以延长该对象的寿命,直到释放池本身为止(如果对象保留在中间,则对象可以生存更长的时间)。
...
Application Kit在事件周期(或事件循环迭代)的开始(例如鼠标按下事件)的开头自动创建一个池,并在结束时释放它,因此您的代码通常不必担心它们。但是,在三种情况下,您可以使用自己的自动释放池:
...

因此,如果在耗尽相应的自动释放池之后需要实例保持 Activity 状态,请保留它们以获取所有权。否则,通常只让它们由池处理。

10-07 16:12
查看更多