retain]和 init]之间的区别
由于以下两个目的相同,
today = [[NSDate date] retain];
和
today = [[NSDate alloc] init];
那他们有什么区别?
这里的任何事情都和内存分配方法有关,否则就是相应地使用它们的原因。
[NSDate date]
是一个方便的构造函数,使用它你可以离开对象autorelease池头痛。 将retain
消息发送到便捷构造函数(如[[NSDate date] retain]
将使您成为对象的所有者,并且您有责任正确地释放它。
[[NSDate alloc] init]
是您成为对象所有者的默认初始化程序,它几乎等于 [[NSDate date] retain]
。
除了前者不必要地将对象放入自动释放池中,基本上没有区别。
如果我想在创build它之后保留该对象,并且该类可用-init
样式方法,则几乎总是select通过便捷构造器加上-retain
。
两者实际上没有区别。 在第一个例子中,你只是保留了一个由便捷方法创build的autoreleased实例,它可以完成类似于return [[[NSDate alloc] init] autorelease]
。
当你这样做:
[NSDate date];
…创build一个新的NSDate,它将在事件循环结束时自动释放(而不是释放!)。 你当然可以保留它以保持更长的时间。
当你这样做:
[[NSDate alloc] init];
…创build一个新的NSDate,当你完成它时,你应该释放它。
从内存pipe理的angular度来看, [[NSDate date] retain]
和替代scheme之间的主要区别在于,这个NSDate 至less要到事件循环结束。 如果你只是创build一些对象,那没关系。 但是,如果你创build(并释放)了很多对象 – 比如在一个循环中处理数据时 – 使用前一个模式可能会导致应用程序的内存使用量激增(然后在事件循环结束时突然下降) 。 在后一种模式下,只要释放它,对象就会被销毁。
大多数时候,当一个类有一个autoreleased初始化 – 它看起来像这样:
return [[[NSDate alloc] init] autorelease];
所以当你打电话时[[NSDate date] retain];
,你正在有效地打电话
[[[[NSDate alloc] init] autorelease] retain];
其中,如果你问我,是相当无意义的 – 我只是坚持[[NSDate alloc] init];
用于初始化对象。
方便的方法就是在那里,所以你可以很快得到一个自动释放的对象 – 不要和retain一起使用。 它会做同样的事情,但我会说如果你想要一个保留的对象,最好调用标准的初始化器。
- 是什么触发iOS的屏幕外渲染,混合和layoutSubviews?
- 如何使用Core Data上传和存储Cocoa中的文件?
- SpriteKit中无尽的滚动背景
- 读取文档文件夹中的文本文件 – Iphone SDK
- 在故事板中定制uitableviewcells
- 正确的序列获取注册令牌在iOS上的GCM推送通知? GCM不可靠吗?
- iOS Facebooklogin“给定URL不被应用程序configuration允许”
- dataWithContentsOfURL返回NSCocoaErrorDomain代码= 256蜂窝,但不是WiFi
- AVFoundation,如何captureStillImageAsynchronouslyFromConnectionclosures快门声音?