[iOS]delegate和protocol

今天上班和同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 protocol和java里interface的概念类似,是Objective-C语法的一部分。 定义protocol如下 @protocol ClassADelegate – (void)methodA; – (void)methodB; @end 那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。 函数是需要被实现的,所以如果对于class如下 @interface ClassB { } @end 就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议, 也就是实现了这一组函数。 有了上面这个头文件,我们就可以放心作调用 ClassB *b = [[ClassB alloc] init]; [b methodA]; [b methodB]; 而不用担心出现unrecognized selector sent to instance这种错误了。 所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。 id b = …; [b methodA]; 这种用法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。 那么delegate是什么?其实和protocol没有关系。Delegate本身应该称为一种设计模式。 是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。 比如ClassC @interface ClassC […]

[iOS]一句话Tip之redefinition of class

编译工程发现报redefinition of classXXX的错,但是确实是采用#import而不是#include包含头文件的时候,请从Finder里看看整个工程目录下是不是有两个同名的头文件…有的话这就是罪魁祸首,删之。 为了这问题折腾了好半天,当时多么希望能搜到一点提示… redefinition错误指编译器发现重复定义的类或者结构,用objective-C的时候建议全部采用#import,可以避免一个头文件被包含多次。 当然遇到坑爹的IDE又是另外一回事了…