我有三个类 A类, B类, C类。
A类声明协议如下
@protocol calculate <NSObject>
@required
-(void)addNumbers;
-(void)calculateTotal;
@end
在 A类的实施中,我已经定义了一个属性。
static id <calculate> delegate;
] B类和 C类已实施其中定义的协议和方法。
在A类的实现文件中,如果我想调用由B类和C类实现的正确协议方法,我将执行以下操作
id <calculate> delegate = [Class B alloc] init];
[delegate addNumbers];
id <calculate> delgate = [Class C alloc] init];
[delegate addNumbers];
尽管这有效但我感觉这是不对的。我想知道单个委托对象是否可以确定并在B类或C类上调用正确的 addNumbers
答案 0 :(得分:1)
我建议将协议放入自己的文件中。 A类然后导入该文件并声明对它的支持“@interface Class_A:NSObject(同样,请大写”C“)。
通常,委托将是一个预先存在的对象。为新对象创建它是没有意义的,因为协议的整个概念是能够在不必了解所有对象的情况下发送现有对象。
因此,当您创建B和C时,将其委托属性(使用__weak)设置为某个符合协议的现有对象。然后,这些新对象可以向该对象发送消息。
假设您正在制作计算器,并且您希望一位代表处理计算。很好 - 比如UIViewController,创建这个可以做到这一点的对象,并保持对它的强引用。然后,当您创建需要委托进行计算的按钮时,可以使用之前创建的此对象设置其委托属性
答案 1 :(得分:0)
为什么要在A类中分配B类和C类。
在A类中,它应该调用委托方法[self.delegate addNumbers]
并且不应该引用正在实现它的类。
B类和C类都应该有自己的-(void)addNumbers;
ClassC.m - (无效)的addNumbers { c = a + b; }
ClassB.m - (无效)的addNumbers { c = a + b + d + 1; }
答案 2 :(得分:0)
检查代表的类。
[[delegate class] isKindOfClass:[B class]]