Objective-C中c++
一、全部的类都必须继承自NSObject。数组
二、全部对象都是指针的形式。ide
三、用self代替this。函数
四、使用id代替void*。this
五、使用nil表示NULL,atom
六、只支持单继承,不容许多重继承。spa
七、使用YES/NO表示TRUE/FALSE指针
八、使用#import代替#include,code
八、用消息表示类的方法,并采用[aInstance method:argv]调用形式。orm
九、支持反射机制,
十、支持Dynamic Typing(动态类型), Dynamic Binding(动态绑定)和Dynamic Loading(动态加载)。
十一、不支持命名空间机制。
动态特性
OC作为一门面向对象语言,天然具备面向对象的语言特性,如封装、继承、多态。他具备静态语言的特性(如C++),又有动态语言的效率(动态绑定、动态加载等)。OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之因此叫作动态,是由于必须到运行时(run time)才会作一些事情。
(1)动态类型
动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型是强类型,而动态类型属于弱类型,静态类型在编译的时候就能被识别出来。因此,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。因此这里面就有两个概念要分清:编译时跟运行时。
(2)动态绑定
动态绑定(dynamic binding)貌似比较难记忆,但事实上很简单,只需记住关键词@selector/SEL便可。先来看看“函数”,对于其余一些静态语言,好比c++,通常在编译的时候就已经将将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。而在OC中,实际上是没有函数的概念的,咱们叫“消息机制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC能够先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调用什么方法,须要传什么参数进去。这就是动态绑定,要实现他就必须用SEL变量绑定一个方法。最终造成的这个SEL变量就表明一个方法的引用。这里要注意一点:SEL并非C里面的函数指针,虽然很像,但真心不是函数指针。SEL变量只是一个整数,他是该方法的ID。之前的函数调用,是根据函数名,也就是字符串去查找函数体。但如今,咱们是根据一个ID整数来查找方法,整数的查找字天然要比字符串的查找快得多!因此,动态绑定的特定不只方便,并且效率更高。
(3)动态加载
让程序在运行时添加代码模块以及其余资源。用户能够根据须要加载一些可执行代码和资源,而不是在启动时就加载全部组件。可执行代码中能够含有和程序运行时整合的新类。
Nullability
从版本的 llvm 6.1 (Xcode 6.3) 就已经支持。这个简版的 Optional ,没有 Swift 中 ? 和 ! 语法糖的支持
例如:
@property (nonatomic, strong, nonnull) Sark *sark; @property (nonatomic, copy, readonly, nullable) NSArray *friends;
@property (nonatomic, strong, null_resettable) UIView *view; + (nullable NSString *)friendWithName:(nonnull NSString *)name;
Lightweight Generics
Lightweight Generics 轻量级泛型,轻量是由于这是个纯编译器的语法支持(llvm 7.0),和 Nullability 同样,没有借助任何 objc runtime 的升级,也就是说,这个新语法在 Xcode 7 上可使用且彻底向下兼容(更低的 iOS 版本)
平时也得注意 协变性和逆变性
__covariant - 协变性,子类型能够强转到父类型(里氏替换原则)
__contravariant - 逆变性,父类型能够强转到子类型(WTF?)
__kindof
__kindof 这修饰符仍是很实用的,解决了一个长期以来的小痛点,拿原来的 UITableView 的这个方法来讲:
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
Objective-C中的命名前缀说明:
NS-:NextStep CF-:Core Foundation CA-:Core Animation CG-:Core Graphics UI-:User Interface
Objective-C中没有类的静态变量,只有全局变量
Objective-C中的数组NSArray能够保存不一样类型的数据。
Objective-C也支持run-time时的类类型检查
用于判断该对象是否属于某个类或者它的子类(以下:)
- (BOOL) isKindOfClass: classObj
用于判断该对象是否属于某个类(这里不包括子类)(以下:)
- (BOOL) isMemberOfClass: classObj
- (BOOL) respondsToSelector: selector
用于判断该对象是否能响应某个消息。这里,咱们能够将@selector后面带的参数理解为C++中的函数指针。
注意:
1)不要忘了@
2)@selector后面用的是(),而不是[]。
+ (BOOL) instancesRespondToSelector: selector
用于判断该类是否能响应某个消息。这是一个静态函数。
-(id) performSelector: selector :调用对象的selector方法。
conformsToProtocol 相似于respondsToSelector ,用于动态检查某个对象是否遵照某个协议。
Category:能够为一个已经存在的类添加一些新的功能,只能添加新的方法,不能添加新的数据成员,Category 的名字必须是惟一的
Protocol:至关于C++中的纯虚类