防止类在Objective-c中被子类化

nac*_*o4d 7 objective-c

如何防止特定类被子类化?我不知道final该语言中的此类功能(例如关键字).然而,Apple表示它已经为AddressBookUI.framework中的所有类(在iOS中)这样做了

出于教育目的,我如何实现相同的功能,或者他们将如何做到这一点?

来自iOS7发行说明(需要登录):

在此输入图像描述

smi*_*org 12

这是一种方法:allocWithZone:从"最终"类中替换(替换MyFinalClassName您的实际类名),如下所示:

+ (id)allocWithZone:(struct _NSZone *)zone
{
    if (self != [MyFinalClassName class]) {
        NSAssert(nil, @"Subclassing MyFinalClassName not allowed.");
        return nil;
    }

    return [super allocWithZone:zone];
}
Run Code Online (Sandbox Code Playgroud)

这将防止一个子类,不是的成员MyFinalClassNamealloc"ED(因此init"编为好),因为NSObjectallocWithZone:必须最终被召集,拒绝呼吁super从你的'最终’类,你会避免这种情况.


Bri*_*kel 6

作为Swift互操作的结果,有一种更简单的方法来防止Xcode 6中的子类化.为了防止Swift类在Objective-C中被子类化,它objc_subclassing_restricted被添加到{ProjectName}-Swift.h文件中的所有类定义中.

您可以在项目中使用它:

#if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
# define FOO_FINAL __attribute__((objc_subclassing_restricted))
#else
# define FOO_FINAL
#endif

FOO_FINAL
@interface Foo : NSObject
@end

@interface Bar : Foo
@end
Run Code Online (Sandbox Code Playgroud)

编译器将停止Barwith 的定义,不能使用objc_subclassing_restricted属性对类进行子类化