【发布时间】:2013-08-22 20:18:16
【问题描述】:
我想知道如何在 Objective-C 中创建一个无法分配(或初始化)的类?
我正在尝试复制 SKDownload Apple 类(StoreKit 框架),我注意到文档没有提及任何 alloc 或 init 方法。 这可能在文档中丢失但出现在代码中? (缺少一些 .h 声明以阻止我们使用此方法?)。我试过 +alloc-init 这个类,alloc 和 init 都返回 null。
我想要实现的是一个只有 getter 的 B 类,它只能由 A 类创建(就像工厂方法一样 - 只有 A 可以创建和返回 B 实例,但用户不能创建B 直接)。
例子:
@interface A : NSObject
// Only A "+createB" class method can create B instances
+ (Second *)createBWithValue:(int)value;
@end
@interface B : NSObject
- (id)init; // return nil
+ (id)alloc; // return nil
- (int)value; // this returns the value passed from A
@end
问题 1:您将如何着手创建此类课程?有可能吗?
问题2: B上的-(int)value如何返回A中类方法传入的值? (知道 +alloc、-init 和/或其他内存分配方法可能无效,因为用户无法直接创建 B 类 - B 中的自定义 initWithValue 方法也可能不可用)
我对 Apple 工程师如何做到这一点感到有些困惑……是否存在 Apple 不希望我使用的隐藏方法?
谢谢。
【问题讨论】:
-
@implementation Foo +(id) alloc { return nil; } @end -
旁注:
SKDownload确实有alloc和init方法——Apple 的类文档只排除了继承的方法。 -
是的,文档中缺少 alloc/init 并不表示不应使用这些。 Apple 文档几乎总是忽略没有新语义的继承方法。例如,NSDateFormatter 没有列出 alloc 或 init,但您当然必须使用它们才能使用该类。
-
@Nicolas:不一定。有一个不同的指定初始化程序 (
initWithXPCEncoding:),如下所示:gist.github.com/mdippery/49eb8e548784982c668f 但同样,还有一个alloc和init方法可以执行您所期望的操作(即返回类的实例) .
标签: ios objective-c class memory