[Objective-C] 2014.11.20

1、在Objective-C的世界中,做每一件事情的本质都是在发消息和收消息。包括一个对象执行一个方法,对于系统来说,本质就是对这个对象发生一条
包含执行方法指针的消息,对象收到消息直接调用。

语法模板可理解成如下:
[aObject(消息接收者) aMethod(消息)]

那么消息是如何运作的呢?

当编译器运行时发现"[aObject aMethod];"时,它会直接去调用内部消息函数objc_msgSend,这个函数有两个主要参数,即消息接收者和方法指针。

objc_msgSend(消息接收者,方法)
//如果有多个参数,则加在后面接收
objc_msgSend(消息接收者,方法,参数1,参数2);
第二个参数“方法指针”的获取,编译器会去调用取方法的函数"methodForSelector:(SEL)aSelector",这个函数有一个SEL类型的参数,可以用
"@selector(方法名)"方法来获得的SEL类型的参数。

在Objective-C中,对于每个实例对象,其中都会有一个isa指针,isa意思其实就是英文的"is a”,同一个类创建出来的对象的isa是一样的。
它的作用就是告诉对象它是哪个类以及它的父类是谁,这个指针只有在程序执行的时候才看得见(在调试模式的具体对象处能够找到)。
当我们对某个类创建的对象运行过一次方法后,方法及方法的实现都会被加入这个类的一个缓存当中,这样下次调用的时候就会非常快速。

2、在Objective-C的类成员变量声明中,默认都是使用protected来修饰变量,即变量对于子类是可以看到且可以使用的。如果你想把成员变量变成
public或者private的话,只需在需要变更类型的变量前增加一个"@public"或"@private"关键字即可。

在Objective-C中,self表示对象自己,它和c++中的this含义相近,super表示父类对象。

3、继承和重写(override)
对于重写来说,调用的优先级是自下而上的,即继承对象在调用方法的时候,先判断自己是否实现了,如果没有实现再继续访问父类。即“isa”。

4、分类(category)
Objective-C提供的分类特性,让我们有机会去扩展那些已经存在的类,这次让我们来扩展NSObject的库,给它加上receiveAttack方法(一个例子)

#import<Foundation/Foundation.h>

@interface NSObject (Enemy)
//收到攻击的处理接口
-(void)receiveAttack:(int)attackValue{
    if(attackValue>100)
    {
        //
    }
    else
    {
        //
    }
}

-(int)attackValue
{
    switch(_quality){
        case kExcellQuality:
            return 100000;
        default:
            return 700;
    }
        
}
@end

//Objective-C开发规约中明确指出,所有的扩展类的文件名,都需要以“(已有类库的类名)”+“(扩展类别名)”这个方式来取名。

5、协议(Protocals)和代理(Delegation)
代理是Objective-C中的重要机制,它可以将面向对象编程的封装特性进一步加强,不是自己的事坚决不做,而是转而让对应的事情负责人(代理)
去做。相反,如果是自己需要负责的事情(作为别人的代理),会抢着去做,代理的引入真正意义上完全实现MVC的程序结构框架。

协议是对类的实现进行规约的一套标准,可以保证多个承诺实现协议的类的接口一致性。比如协议中定义了一个接口X,那承诺执行这个协议的类,
就需要实现这个接口X。协议的关键性是让大家都有法可依有据可查。

在Objective-C中,协议和代理是一起出现一起使用的,我们可以通过协议和代理来进行类与类之间的通信和交流。抽象的描述为:如果类A是类B
的代理,那类B定义出一套它的代理需要实现的接口,这套东西以协议的方式提供给A。类A实现这套协议后,每当类B有东西要告知类A,它就能通过
定义好的协议接口来告诉它的代理也就是类A。类A实现协议中的接口,也就可以收到类B要告知它的内容。

你可能感兴趣的:([Objective-C] 2014.11.20)