Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我们能在目标C中覆盖alloc和dealloc吗?_Objective C_Ios_Overriding_Dealloc_Alloc - Fatal编程技术网

Objective c 我们能在目标C中覆盖alloc和dealloc吗?

Objective c 我们能在目标C中覆盖alloc和dealloc吗?,objective-c,ios,overriding,dealloc,alloc,Objective C,Ios,Overriding,Dealloc,Alloc,我知道覆盖alloc或dealoc方法很少需要这样做,但如果需要,在iPhone编程中是否可能?您可以而且确实应该(如果使用手动内存管理)覆盖dealoc以释放您持有的任何资源(不要忘记调用[super dealoc]完成时)。重写alloc是可能的,但正如您所说,很少需要。一般来说,重写alloc只在您希望时进行,例如,从可用实例池中分配对象,或者可能根据某些外部参数为对象分配可变的存储量。(在C++中,您可以访问新< /COD>参数并根据它们分配,但Objto-C不允许访问 我从来没有尝试过

我知道覆盖
alloc
dealoc
方法很少需要这样做,但如果需要,在iPhone编程中是否可能?

您可以而且确实应该(如果使用手动内存管理)覆盖
dealoc
以释放您持有的任何资源(不要忘记调用
[super dealoc]
完成时)。重写
alloc
是可能的,但正如您所说,很少需要。

一般来说,重写
alloc
只在您希望时进行,例如,从可用实例池中分配对象,或者可能根据某些外部参数为对象分配可变的存储量。(在C++中,您可以访问<代码>新< /COD>参数并根据它们分配,但Objto-C不允许访问<代码> 我从来没有尝试过这样做,我怀疑这有点像雷区——你需要研究一下这些结构,并且非常小心

正如Adam所说,如果对象持有任何保留的对象,您应该始终(在引用计数环境中)重写
dealloc

更新:你可以做一件有趣的事。。。在RedClass或其超类中,代码如下:

+(id)alloc {
    if (self == [RedClass class]) {
        return [BlueClass alloc];
    }
    else {
        return [super alloc];
    }
}
最终结果是,无论何时执行
[RedClass alloc]
都将返回一个BlueCLass对象。(注意:假定BlueClass是RedClass的一个子类,否则在返回对象后不久事情就会变得一团糟。)

我并不是说这样做是个好主意,但这是可能的(我也不知道在任何情况下,它对普通的用户定义类都不能可靠地工作)。它确实有一些可能的用途


附加说明:在某些情况下,可能需要使用
[self-issubclasssof:[RedClass]]]
而不是
=
(尽管这有一些严重的缺陷)。

几个说明:
NSObject
的子类应该覆盖
allocWithZone:
而不是
alloc
,并且不能在使用ARC编译的代码中重写
dealloc
。更正:我应该说,“为ARC编译的代码不能调用
[super dealloc]
”。仍然可以覆盖dealloc,但很少有用。如果您需要在实例即将解除分配时从通知中注销或删除手势识别器,则重写
dealloc
仍然是一种很好的做法。从通知中注销,并将自己标记为不再是代表,无论您是代表的目的是什么。但是,是的,在ARC中,您不能调用
[super dealoc]
,或者更重要的是,您不需要调用,因为ARC代表您“到处都是”。Objective-C不允许您访问initXXX参数。嗯?Objective-C不阻止您访问与
alloc
相关的任何内容,但是
alloc
没有参数(除了
self
\u cmd
)如果你是指关于实例的信息,例如,它们的大小,Objto-C运行时让你访问一个实现者需要知道的任何东西和所有东西。对,没有参数可以分配。但是C++允许AOLC例程访问<代码>新的< /COD>参数。对象是什么?像
NSNumber
有一个公共值实例池吗?我知道
[NSNumber numberwhithint:1]
等是如何工作的,因为我们在alloc之前得到了参数,但是它怎么知道用
[[NSNumber alloc]initWithInt:1]返回相同的实例呢
?即使有带标签的指针或所有其他他们在幕后做的花哨事情,你仍然会在不知道存储值的情况下首先调用alloc。我唯一能想到的是调用
[NSNumber alloc]
返回一个共享实例,然后
-[NSNumber initWith…]
返回特定的一个。是吗?真是太棒了…正如我所想。
[NSNumber alloc]
返回
NSPlaceholderNumber
+[NSNumber numberwhithint:100]的共享实例。返回带标记的指针,因此无论调用多少次它都是一样的。
-[NSNumber initWithInt:100]
返回相同的标记指针。