[英]iOS objective-c return object availability/scope
我已经阅读了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];
苹果文档 :
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返回的自动释放对象将可用。 关于苹果公司的文档“自动发布对象将在其可变范围内可用”。 我应该保留它吗?
问题1:仅关于Apple的内存管理建议是错误的(调用者没有表明他们拥有返回的对象),或者从技术上讲这也是错误的吗?
从技术上讲,这是正确的,因为在使用myString
后释放它。 但是,如果您遵循Apple 的方法命名准则 ( 强烈建议),则这显然是错误的:
您拥有自己创建的任何对象。 您可以使用名称以“ alloc”或“ new”开头或包含“ copy”(例如alloc,newObject或mutableCopy)的方法“创建”对象。
method1
不包含create
, alloc
, new
或copy
-因此每方针调用方不拥有该对象,并没有将其释放。
问题2:在我的函数调用之后多远(或更深),由obj1返回的自动释放对象将可用。 关于苹果公司的文档“自动发布对象将在其可变范围内可用”。 我应该保留它吗?
自动释放的对象将保持活动状态,直到耗尽最近的自动释放池为止,请参阅自动释放池 :
自动释放池是NSAutoreleasePool的一个实例,该实例“包含”收到自动释放消息的其他对象。 释放自动释放池后,它将向每个对象发送释放消息。 一个对象可以多次放入一个自动释放池中,并且每次将其放入池中时都会收到一个释放消息。 因此,向对象发送自动释放而不是释放,至少可以延长对象的寿命,直到释放池本身为止(如果对象保留在中间,则对象可以生存更长的时间)。
...
Application Kit在事件周期(或事件循环迭代)的开始(例如鼠标按下事件)的开头自动创建一个池,并在结束时释放它,因此您的代码通常不必担心它们。 但是,在三种情况下,您可以使用自己的自动释放池:
...
因此,如果在耗尽相应的自动释放池之后需要实例保持活动状态,请保留它们以获取所有权。 否则,通常只让它们由池处理。
因为我要释放先前分配的对象,所以没有内存泄漏,对吗?
对
它们“丢失对它的引用”是什么意思?
您不持有该对象的指针,因此可能无法在程序中访问该对象。
仅关于Apple的内存管理建议是错误的(调用者没有表明他们拥有返回的对象),或者在技术上也是错误的吗?
也正确。 静电分析仪也会哭
在我的函数调用之后多远(或更深),由obj1返回的自动释放对象将可用。 关于苹果公司的文档“自动发布对象将在其可变范围内可用”。 我应该保留它吗?
这有点复杂。 自动释放池通过线程相互堆叠。 这就是为什么在进入线程或新的事件循环迭代时必须创建一个线程的原因,也是为什么在执行创建许多(自动释放)分配的大型操作时显式创建线程的好主意。
最后,在运行循环迭代结束时,将销毁堆栈中用于线程的最后一个池。
如果对象是在您显式创建的自动释放池下创建的,则必须保留该对象才能在创建该池的生命周期内使用它。
同样,传递给其他线程时必须正式保留/复制。 通常,这会立即发生-在进入辅助线程的实现时,您只需创建一个副本或保留形式参数即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.