如何防止特定类被子类化?我不知道final该语言中的此类功能(例如关键字).然而,Apple表示它已经为AddressBookUI.framework中的所有类(在iOS中)这样做了
出于教育目的,我如何实现相同的功能,或者他们将如何做到这一点?

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)
这将防止一个子类,不是的成员MyFinalClassName被alloc"ED(因此init"编为好),因为NSObject的allocWithZone:必须最终被召集,拒绝呼吁super从你的'最终’类,你会避免这种情况.
作为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属性对类进行子类化
| 归档时间: |
|
| 查看次数: |
3949 次 |
| 最近记录: |