Objective-C有类似C++虚函数的东西吗?

Mat*_*art 0 virtual-functions properties dynamic objective-c

在objective-c中,可以向属性添加@dynamic.

这也适用于普通的实例方法吗?

编辑 我认为我不够清楚.

我想做以下事情:

@interface MyClass
@property (retain) NSObject *somePropertyObject;
- (void) myMethod;
@end

@implementation MyClass

@dynamic somePropertyObject;

//Make myMethod dynamic. I do not want to implement it. Like C++ Virtual

@end
Run Code Online (Sandbox Code Playgroud)

ipm*_*mcc 5

如果您的意思是"我如何声明一个方法,但不提供我将在运行时提供的定义?" 然后它很容易,只需使用一个类别.像这样:

@interface MyObject : NSObject

// Methods I'll define
- (void)doFoo;

@end

@interface MyObject (DynamicallyProvidedMethods)

// Methods I won't
- (void)myDynamicMethod;

@end


@implementation MyObject 

// Methods I'll define
- (void)doFoo
{
}

@end
Run Code Online (Sandbox Code Playgroud)

编译器不会抱怨,但是如果你在运行时调用-myDynamicMethod,除非你以某种方式为它提供了一个实现,它将与"无法识别的选择器"崩溃.当然,您可以通过调用respondsToSelector:在运行时测试它.

相关地,如果您正在寻找一个近似等效的基类纯虚方法,我建议提供一个空实现,如果它没有被子类覆盖,则在调用时断言.你可以这样做:

NSAssert((class_getInstanceMethod([self class], _cmd) == class_getInstanceMethod([MyObject class], _cmd)),
    @"Subclass of %@ must override -%@", 
    NSStringFromClass([MyObject class]), 
    NSStringFromSelector(_cmd));

// ...where overridesSelector:ofBaseClass: looks like: 
//
//     return ;
Run Code Online (Sandbox Code Playgroud)

当然,这不会在编译时提醒你注意问题,但总比没有好.

HTH