代码之家  ›  专栏  ›  技术社区  ›  Ben Zotto sberry

创建“永久”Cocoa对象

  •  0
  • Ben Zotto sberry  · 技术社区  · 14 年前

    我有一个对象工厂,它提供一些“常量”不变对象的实例。我希望这些对象受到客户机坏内存管理的保护。这就是我如何重写类的键方法。我是否遗漏了什么(代码或其他注意事项)?

    - (id)retain
    {
        return self;
    }
    
    - (NSUInteger)retainCount
    {
        return UINT_MAX;
    }
    
    - (void)release
    {
        // nothing.
    }
    

    更新后的逐条阅读:这是(有意)一个特殊的情况,双黑钻石可可问题。如果您试图创建一个常规的单例实例,请参阅下面关于共享实例等的答案。在选择此实施策略之前,此问题(以及所选答案)属于“您应该确保知道您在做什么”。

    4 回复  |  直到 14 年前
        1
  •  1
  •   mipadi    14 年前

    您可能还需要重写 copyWithZone: autorelease :

    - (id)copyWithZone:(NSZone *)zone
    {
        return self;
    }
    
    - (id)autorelease
    {
        return self;
    }
    
        2
  •  2
  •   Rob Keniger    14 年前

    听起来你是在尝试创建一个单例。这是一个非常常见的模式,有很多关于它的文章。这些链接应该告诉您需要知道的所有信息:

    http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html

    http://boredzo.org/blog/archives/2009-06-17/doing-it-wrong

    当然还有苹果的文档 here here .

        3
  •  1
  •   dreamlax    14 年前

    嗯,为了真正的永久性:

    - (void) dealloc
    {
        return;
        [super dealloc]; // stop compiler warning
    }
    

    但是,这真的有什么好处呢?您的客户是不是不遵守有良好文档记录的内存管理规则?

        4
  •  1
  •   Ukko    14 年前

    像这样破坏保留/释放合同的想法对它来说真的很糟糕。在类对象中保留对singleton对象的引用是否足够好?这样就可以防止对象在正常代码中被释放。

    如果您只是为了防止意外的过度发布,一个更好的策略是快速失败并修复原始问题,不是吗?我只是不喜欢破坏更糟糕的解决方案来容纳破坏的代码。