【问题标题】:can we override alloc and dealloc in objective C?我们可以在目标 C 中覆盖 alloc 和 dealloc 吗?
【发布时间】:2011-11-27 15:22:08
【问题描述】:

我知道这很少需要覆盖allocdealloc 方法,但如果需要,是否可以在 iPhone 编程中实现?

【问题讨论】:

    标签: objective-c ios overriding dealloc alloc


    【解决方案1】:

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

    【讨论】:

    • 一些注意事项:NSObject 的子类应该覆盖 allocWithZone: 而不是 alloc,并且不能在使用 ARC 编译的代码中覆盖 dealloc
    • 更正:我应该说,“为 ARC 编译的代码不能调用 [super dealloc]”。仍然可以覆盖 dealloc,但很少有用。
    • 覆盖 dealloc 仍然是一个很好的做法,以防您需要在实例即将被释放时从通知中取消注册或删除手势识别器。
    • 从通知中取消注册,并将自己标记为不再是代表的任何代表。但是,是的,在 ARC 中,您不能致电 [super dealloc],或者更重要的是,您不需要这样做,因为 ARC 代表您“全力以赴”。
    【解决方案2】:

    一般来说,覆盖alloc 仅在您希望时完成,例如,从可用实例池中分配对象,或者可能基于某些外部参数为对象分配可变数量的存储空间。 (在 C++ 中,您可以访问 new 参数并根据它们进行分配,但 Objective-C 不允许您访问 initXXX 参数。)

    我从来没有尝试过这些,我怀疑它有点雷区——你需要研究结构并非常小心。

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

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

    +(id)alloc {
        if (self == [RedClass class]) {
            return [BlueClass alloc];
        }
        else {
            return [super alloc];
        }
    }
    

    最终结果是,无论何时执行[RedClass alloc],都会返回一个BlueCLass 对象。 (注意:可能 BlueClass 是 RedClass 的子类,否则在返回对象后不久事情就会变得严重。)​​

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

    附加说明:在某些情况下,人们可能希望使用[self isSubclassOf:[RedClass class]] 而不是==(尽管这有一些严重的缺陷)。

    【讨论】:

    • "Objective-C 不允许您访问 initXXX 参数。"嗯?
    • Objective-C 不会阻止您访问与alloc 相关的任何内容,但alloc 没有参数(self 和@987654332 除外@),所以不清楚你指的是什么。如果您指的是有关实例的信息,例如它们的大小,Objective-C 运行时可以让您访问实现者需要知道的所有内容。
    • 对,没有参数可以分配。但是 C++ 允许 alloc 例程访问 new 参数。
    • NSNumber 这样有一个公共值实例池的对象呢?我了解[NSNumber numberWithInt:1] 等将如何工作,因为我们在分配之前获得了参数,但是它如何知道使用[[NSNumber alloc] initWithInt:1] 返回相同的实例?即使使用标记指针或它们在幕后做的所有其他花哨的东西,您仍然首先调用 alloc 而不知道存储的值。我唯一能想到的是调用[NSNumber alloc] 返回一个共享实例,然后-[NSNumber initWith...] 返回特定的。是吗?
    • 太棒了...就像我想的那样。 [NSNumber alloc] 返回NSPlaceholderNumber 的共享实例。 +[NSNumber numberWithInt:100] 返回一个标记的指针,所以无论你调用多少次它都是一样的。 -[NSNumber initWithInt:100] 返回相同的标记指针。
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多