objective-c与c++的差异

oc的编译指令为 clang -fobjc-arc -framework Foundation test.m -o test

oc中,1表示YES,0表示NO。并不是非0值都是YES,这是因为BOOL类似本质上是 signed char.

关于块,oc中可以在函数内定义块。块的功能类似于函数,但可定义于函数内,且对函数内的成员变量没有修改权限。但用 __block 修饰的变量可以被修改

在类定义部分声明的成员变量和成员函数,只能在类中使用,相当于定义了隐藏的成员变量和函数,效果等同于在类接口中定义@private的变量。(我可以理解为私有吗?oc没有友元)

类别,可以为一个已存在的类,添加方法。关于类别的声明格式:

//ClassName+CategoryName.h
@interface ClassName(CategoryName)
//method declarations
@end

//ClassName+CategoryName.m
@implementation ClassName(CategoryName)
//method declarations
@end

类别的文件名约定,一般使用 ClassName+CategoryName.h{m} 形式。

相对于继承,类别的优点有:系统中存在的类,可以不经任何修改,就可以通过类别来扩展功能;也可以将某部分功能块独立起来,达到封装目的;类别的方法就是类的方法,所以可以自由引用类的私有实例变量。

匿名的类别,又称为扩展,两者的区别是:

①类别中只能增加方法;

②是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该 实例变量默认是@private类型 的(作用范围只能在自身类,而不是子类或其他地方);

③类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为 类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。

④类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说, 类扩展所声明的方法必须依托对应类的实现部分来实现。

⑤定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。

关于协议和委托:

正式协议相当于接口规范(尽管即使未实现协议中的方法,编译时也只是警告而已),有 @required 和 @optional 两个类型,分别表示必须实现(即使没有实现,编译器也只是给警告)和可选实现。

所谓非正式协议,是使用类别来实现的,就是NSObject的一个类别而已,这样继承NSObject的类,就可以实现其类别中要求的方法,类似于协议了。