1
8
这个
不过,你说得对,物体本身并不属于自己。如果
这是少数几种情况之一,其中一个对象可以代表另一个对象释放对象(在本例中是对象本身)。另一种选择是不释放它,如果你打算返回
一般来说,任何时候当你有一个对象保留或释放它自己时,你都应该感到脏兮兮的。 在这种特殊情况下 ,没关系,因为您正在防止一个bug(泄漏),而不是创建一个bug。
作为
因此,如果
再次审视假设*
在所有这些情况下
*那个
|
2
3
如果由于某种原因初始化失败并且必须返回null,则必须释放该对象以避免内存泄漏。 类似地,in it可能决定交换一个不同的对象并返回它-在这种情况下,您还必须释放该对象以避免内存泄漏。 在这两种情况下都是必要的,因为In it没有返回原始对象,并且在方法返回后将成为孤立对象。Alloc已经自动保留了这个对象,所以如果不释放它,它的保留计数将永远停留在1。 |
3
1
[另一种观点会有帮助吗?] init方法(及其同级initWith。。。是一个有点奇怪的情况,但不是内存分配规则的特殊情况。in it很奇怪,因为它的名称听起来像是要改变实例的内部结构,但实际上它可能做的不止这些(它可以替换其他一些对象并初始化 那个 例如,对象)。提示在init的声明中:
对
init方法返回一个对象,因此它最好命名为“return an object that is(class-wise)an equivalent object and that has been initialized”。大多数方法不执行这种switchero,这使得init有点不同/奇怪。 alloc/init嵌套没有什么“魔力”——它只是处理从alloc返回的对象可能与从init返回的对象不同这一事实的最简单方法。这工作非常好:
完全等同于“标准”成语:
这可能有问题:
当实现返回的对象与作为传入“self”接收的对象不同时,必须特别小心地完成init方法的实现。在这种情况下,In it方法负责“self”对象的内存管理(因为它不会返回该对象,所以可以指望谁来管理?) 这是有可能做一些相当丑陋的诡计,顺便说一句,不要在家里尝试这个!
这样做是非常糟糕的做法,因为这取决于初始化。。。。。方法总是返回一个新对象(而不是它接收的对象)。这显然是个糟糕的假设! 注意,通过“一个在'self'中接收对象的方法”,我的意思是该方法是由一个对象调用的,并且该对象通过'self'指针按惯例可用。 |
4
0
基本原则不适用于这种特殊情况。 事实上,不要担心它-除非你打算摆姿势,否则你不需要编写这样的代码,而且它对你编写的代码没有任何影响。 您应该继续遵循所有代码中的基本规则。 |
5
0
(巴博萨船长) alloc/init有点特殊。您必须在init中执行retain/release操作,这样调用方返回的任何对象都归调用方所有,并且没有泄漏。 |
Gonii · 存储。c中动态分配的结构数组中的csv文件 7 年前 |
Administrator · C-free函数崩溃 8 年前 |
Rub3n · c语言中二维数组的重新分配 8 年前 |
morowinder · 何时在c#中的堆栈上分配数组? 9 年前 |
cheezsteak · 在Python中预分配或不预分配列表 10 年前 |
user2673108 · 动态内存管理场景 11 年前 |
foboi1122 · 带有指针数组的HDF5结构 11 年前 |