相关疑难解决方法(0)

客观c类和继承

如果在该类的类和类别中定义了一个方法,则未定义将调用哪个实现.

但这如何与继承相互作用?特别:

  • 给定一个超类类别方法和子类中的常规方法,是否可以保证子类实现在子类成员上调用时会获胜?
  • 给定一个超类常规方法和一个试图覆盖它的子类类别方法,是否保证子类类实现在子类成员上调用时会获胜?
  • 给定一个超类类别方法和一个子类类别方法,是否保证子类类别方法在子类成员上调用时会获胜?

iphone inheritance objective-c categories ios

12
推荐指数
2
解决办法
4414
查看次数

在NSObject上使用类别提供默认协议实现有什么问题?

我一直在寻找一种方法来使用可选的协议方法并拥有干净的代码.换句话说:
1:respondsToSelector:我的代码没有调用
2.应该适用于任何方法签名,因此NSObject上的类别方法进行检查和调用performSelector:(NSInvocation与ARC合作有问题)
3:此解决方案,IMO,假装是普遍的但具有1的所有缺点

我最终提出了这个想法:

@protocol MyProtocol <NSObject>
@optional
-(void)optionalMethod;
@end

@interface ClassA : NSObject <MyProtocol>
@end

@implementation ClassA

-(void)optionalMethod{
     NSLog(@"ClassA implements optionalMethod");
}

@end

@interface ClassB : NSObject <MyProtocol>
@end

@implementation ClassB
//classB does not implement optionalMethod
@end

@interface NSObject (DefaultMyProtocolImplementation)
-(void)optionalMethod;
@end

@implementation NSObject (DefaultMyProtocolImplementation)
-(void)optionalMethod{
     NSLog(@"%@ does not implement optionalMethod", NSStringFromClass([self class]));
}
@end
Run Code Online (Sandbox Code Playgroud)

它似乎工作,即:

...
ClassA *objA = [[ClassA alloc] init];
ClassB *objB = [[ClassB alloc] init];

[objA optionalMethod]; //prints …
Run Code Online (Sandbox Code Playgroud)

protocols objective-c objective-c-runtime ios objective-c-category

8
推荐指数
1
解决办法
1080
查看次数