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]
返回相同的标记指针。