Objective-C自动释放内存pipe理
我试图了解何时调用autorelease,以及这将实际做我的对象。
在阅读关于 Mac开发者库中关于内存pipe理的内容之后,我明白当你有一个充当工厂方法的方法时 – 通过创build一个新的对象并返回它 – 在返回对象之前,该方法没有办法释放对象,导致返回一个释放的对象。
例
- (Test *) createNewTest { Test *newInstance = [[Test alloc] init]; [newInstance release]; return newInstance; // deallocted object returned. }
相反,我应该使用autorelease
:
由NSObject定义的autorelease方法标记接收器以供以后发布
我的问题是:如果稍后要发布对象,我怎么知道它被释放的时间?
- (Test *) createNewTest { Test *newInstance = [[test alloc] init]; [newInstance autorelease]; return newInstance; } - (void) runIt { Test *myInstance = [self createNewTest]; // when is myInstance released?? and thereby not valid to my function anymore? }
我怎么能安全地使用我的runIt
方法中的返回的autoreleased对象,如果我不知道什么时候autorelease发生? 我应该保留由createNewTest
返回的对象吗? 或者我可以在runIt
范围内安全地使用它吗?
自动释放的对象被添加到自动释放池。
autorelease池中的对象在主循环的迭代结束时被释放(或者如果你正在pipe理自己的自动释放池和/或如果调用drain,则会更快)。
当你调用一个返回一个自动释放对象的方法时,它几乎保证保持有效,直到至less被调用的作用域的末尾。
如果你想确保它活得更长,那么你应该保留它,记住当你完成它时再次释放它。
我如何安全地使用我的runIt方法中的返回的autoreleased对象,如果我不知道什么时候autorelease触发器?
当前运行循环结束后,自动释放将触发。
我应该保留由createNewTest返回的对象吗? 或者我可以安全地在runIt范围内使用它吗?
您可以在runIt范围内安全地使用它。
它更好地保留该对象,并在使用后释放它。
负责创build它的人和调用runIt的人必须保留这个对象。 当负责人完成后,应该释放该对象。
- 如何在doRegisterForRemoteNotificationsWithDeviceToken以外的方法中使用设备标记?
- 在Objective-C中使用枚举?
- CoreBluetooth状态保存问题:iOS 7.1中未调用willRestoreState
- MonoTouch.Dialog:如何设置EntryElement的字符数限制
- Parse.com错误“启用固定时不允许使用方法”。 当我使用PFQueryTableViewController子类
- XCode5模拟器:未知选项字符“X”在:-Xlinker
- 使用IOS设备的蓝牙连接
- Swift vs Objective-C:应用性能
- date时间格式从iPhone设置和GMT偏移