【发布时间】:2011-03-19 21:44:16
【问题描述】:
我已经使用 ojective c 快一周了,我主要是一个 c++ 编码器。在我阅读了苹果的内存管理指南之后,我尝试将我在 c++ 中的内存使用风格带入客观的 c... 我试图总结这些场景,如果我按照这些说明进行操作,我想我不会犯内存错误。如果我错了,请告诉我:)
我会尽量不使用autorelease,个人来说,使用autorelease,在某些自动释放池被耗尽之前,可能总会有一些冗余内存。我只会使用 release,它可以确保我的应用程序在任何时候都使用最少的内存。
Apple 说的另一件事,我用我自己的话来描述,是:每次我添加一个 retain/alloc/copy,我都应该在某处添加一个 release。
以下是我总结的所有场景:
在同一个函数中:alloc一个对象,使用它,然后释放它
在类的init函数中,alloc是一个对象,在类的dealloc函数中,释放对象
-
当需要拥有一个指针时,应该在一个类的方法中保留一个输入指针(比如说方法A),然后释放类的dealloc函数中的指针。
我发现objective c中使用retain的时机和c/c++中使用memcpy的时机是一样的,所以我取retain 作为“内存高效副本”
如果输入的保留指针要设置为成员指针变量,则应先释放成员指针。 所以在case[3]中,类的init中的alloc与method A中的release配对, 方法A中的retain与dealloc
中的release配对 -
返回一个指针作为返回值。老实说,当我使用 c++ 时,我从不做这样的事情。如果返回一个成员指针也没关系,因为有人会照顾它:
-(UIButton*) getTheButton() { return theButton; }但是返回一个指向本地分配对象的指针真的很糟糕:
-(UIButton*) getTheButton() { UIButton* myButton = [[UIButton alloc] init]; return myButton; //TERRIBLE! }有人可能会说在这种情况下我应该使用自动释放,但我只是想通过使用这个来绕过该解决方案:我只会返回成员指针,或者我不会返回指针,我只会对给定的输入指针进行操作。
-void operateOnTheButton(UIButton* button) { [button release]; button = [[UIButton alloc] init]; }
所以,如果我按照上面的内存使用说明操作有任何问题,请告诉我。
谢谢:D
【问题讨论】:
-
次要注意:您的最后一个 sn-p 似乎假设
button是一个输入输出参数。事实并非如此,输入输出将是(UIButton**)button。 -
我尝试将我在 c++ 中的内存使用风格带入目标 c。那你就会失败。不要对你不熟悉的事物抱有偏见。
标签: objective-c memory-management retain