Month: August 2011

[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

一个初始化结构体的用法

近来敲代码的时候,由于技术含量不高,所以就格外注重“代码好不好看”这个问题。 在无聊的Coding中看到一个没有用过的语法还是小有惊喜的。 记在这里: 主要是这段 DemoStruct demos[4] = { {.val = 1, .point = &a}, {.val = 2}, {.point = &b}, {.val = 3, .point = &c}, }; 对于结构复杂一点的struct,这么写是不是挺好看的 :]

[iOS]一句话Tip之redefinition of class

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

[Ruby]修改GemPath

通过命令查看gem的安装位置、源等信息 $gem env 如果需要修改gem的默认安装位置,比如由于没有root权限,希望gems都默认安装到用户目录下 修改~/.gemrc文件 增加内容 gempath: - /home/haoxiang/.gem - /usr/lib/ruby/gems/1.8 gemhome: /home/haoxiang/.gem