Pio*_*otr 0 iphone memory-management objective-c
我正在与Daniel H Setinberg的"Cocoa Programming"开始我的Objective-C之旅.有一点让我对内存管理感到惊讶.实际上我发现Objective C中的内存管理比C更复杂,虽然我还没有触及"非垃圾收集语言"一段时间,所以使用malloc及其朋友的旧时代可能在我的记忆中理想化:).
让我困惑的是以下几点:
-(void) loadURLFromTextField{
NSURL *url = [NSURL URLWithString:self.address.text];
NSURLRequest *request = [NSURLRequest requestWithUrl:url];
[self.webView loadRequest:request];
}
Run Code Online (Sandbox Code Playgroud)
在第二行和第三行我分配了两个对象,所以我假设我需要在某处释放它们.然而,这段代码的评论指出:
"请注意,我们正在使用类方法来构建请求和URL的自动释放实例.我们不需要自己发布它们."
有人可以帮助我理解为什么这些实例是自动释放的,以及如何从SDK文档中获取此实例.返回对象实例的所有类方法实际上都是自动释放的标准吗?感谢您的帮助!
Mac*_*ade 10
您不必释放它们,因为您没有"拥有"它们(您没有明确地分配它们,也没有保留它们).
自动释放的对象放置在NSAutoreleasePool类的当前实例上,它将在下次池耗尽时自动向它们发送释放消息,因此通常在当前运行循环结束时.
这称为便捷方法,返回自动释放的对象.
因此,如果你不调用alloc,或者保留,你基本上不拥有这些对象,所以你不应该关心释放它们,就像别人会做的那样......
如果你释放它们,你可能会有一个段错误,因为释放两次物体可能会导致双重释放......
例如:
NSArray * myArray = [ NSArray emptyArray ];
Run Code Online (Sandbox Code Playgroud)
自动释放对象,方便方法.你不拥有它,所以你不必释放它.
NSArray * myArray = [ [ NSArray emptyArray ] retain ];
Run Code Online (Sandbox Code Playgroud)
您保留它时必须释放阵列.
NSArray * myArray = [ [ NSArray alloc ] initWithArray: someArray ];
Run Code Online (Sandbox Code Playgroud)
同样在这里,您明确分配了数组.
NSArray * myArray = [ [ [ NSArray alloc ] initWithArray: someArray ] autorelease ];
Run Code Online (Sandbox Code Playgroud)
无需在此处释放,因为对象已放置在自动释放池中,并将自动接收释放消息.
归档时间: |
|
查看次数: |
3992 次 |
最近记录: |