Tha*_*nks 7 iphone cocoa-touch memory-management uikit
在某个地方,我正在阅读 - 关于低记忆警告和放弃一个不可见的视图及其所有的子视图(=我觉得整个笔尖),你应该这样做:
-(void)dealloc {
[anView release], anView = nil;
[someImageView release], someImageView = nil;
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
而不是
-(void)dealloc {
[anView release];
[someImageView release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
在我调用release之后,将这些指针接口为nil(="no object")的原因是什么?让我猜一下:其他一些方法可能因为某种原因而得到了视图(任何人可以在何时发生这种情况?),然后发生didReceiveMemoryWarning事件,并释放一个当前不可见的整个笔尖+视图(即在multiview-app中).一旦用户想再次看到该视图,您将再次快速加载笔尖然后:它加载所有视图,连接插座,然后砰!你的另一个保留视图现在已经挂起,没有任何指针在内存块中的某个地方孤独,导致内存泄漏,直到你的应用程序崩溃.
正确错误?
mou*_*iel 14
这个原则比UIView更普遍.实际上它比Objective-C/Cocoa -release方法更通用.它也适用于C malloc()/ free()内存功能.
当您不再需要对象或任何内存区域时,首先释放/释放它.然后,为了确保不再使用它,可以通过分配nil对象或NULL内存指针来清除访问此对象或内存区域的方法.
Arj*_*jan 11
其他一些方法可能因某种原因而得到了观点
除非你dealloc自己调用,否则只有当保留计数变为零时才会调用它.
请注意,在Objective-C中,向nil"对象" 发送消息(通常)非常好.这样做不会使程序暂停,但是消息会被忽略.但是,您无法向释放的对象发送消息,这会导致崩溃.
因此,以下内容会给您一个错误:
[anView release];
[anView doSomething];
Run Code Online (Sandbox Code Playgroud)
但是,这实际上是好的:
[anView release];
anView = nil;
[anView doSomething];
Run Code Online (Sandbox Code Playgroud)
这是一个品味的问题,但对于上述情况,你可能实际上更喜欢崩溃你的程序,而不是想知道为什么没有执行某事...
另请参阅Apple的Objective-C 2.0编程语言简介中的发送消息为零.
如果您的访问器具有与其关联的属性 yoc 并执行以下更简洁的方法,而不是执行显式释放并设置为 nil:
- (void) dealloc
{
self.retainedProperty1 = nil;
self.retainedProperty2 = nil;
self.copiedProperty = nil;
self.assignedProperty = nil;
}
Run Code Online (Sandbox Code Playgroud)
这样您就可以拥有更少重复的代码,因为合成代码将为您处理您的发布。
编辑:我应该指出你的属性不能是只读的,否则你会因为明显的原因而得到编译器错误:)
| 归档时间: |
|
| 查看次数: |
3496 次 |
| 最近记录: |