我想知道如何在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中的类方法中传递的值? (由于用户不能直接创建B类,因此+ alloc,-init和/或其他内存分配方法可能会作废-而且B中的自定义initWithValue方法也可能不可用)

我对Apple工程师的工作方式感到有些困惑。是否有Apple不想让我使用的隐藏方法?

谢谢。

最佳答案

我注意到文档没有提及任何alloc或init方法

从文档中:

您的应用程序永远不会直接创建SKDownload对象。相反,在处理付款后,您的应用会读取交易对象的
downloads属性可检索一组SKDownload对象
与交易相关联。
是否有Apple不想让我使用的隐藏方法?

是。 苹果不希望您使用很多隐藏方法。
因此,我们的想法是您不应该自己创建SKDownload实例,因此,初始化方法不属于 public API的一部分。这并不意味着没有创建SKDownload实例的方法,只是没有公开的方法可以创建它们。
类限制分配或初始化是很常见的。例如,单例类通常会覆盖+allocWithZone:,以便仅在尚未创建一个新对象的情况下才分配一个新对象。如果存在,则返回该对象(并且初始化程序基本上不执行任何操作)。
隐藏初始化程序。
如果您想自己创建一个类,请重写继承的初始化方法(可能只是-init),以使它们返回nil,甚至可能引发异常。实现您自己的初始化程序,但将其保留在该类的 public 接口之外:

// B.h
@interface B : NSObject
@property(readonly) int value;
@end;

// B.m
@interface B ()
@property(readwrite) int value;
-(id)secretInitializerWithValue:(int)v;
@end

@implementation B
-(id)secretInitializerWithValue:(int)v
{
    if ((self == [super init])) {   // not really necessary since NSObject's -init doesn't do anything
        _value = v;
    }
}

-(id)init
{
     @throw [NSException exceptionWithName:@"Don't do that!"
                                    reason:@"You shouldn't instantiate B yourself."
                                  userInfo:nil];
}
@end
private 可变子类。
另一个选择是使用所需的只读访问器以及具有读写访问器的 private 可变子类创建不可变类。您可以在可变子类中实现-copyWithZone:,以便在进行复制时获得不可变的对象。所有这些与我上面描述的大致相同-不管哪种方式,您都在向客户端隐藏创建机制。

关于ios - 防止在iOS中分配类(class),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18390055/

10-12 17:56
查看更多