第一章 熟悉Objective-C
第1条:了解Objective-C语言的起源
- Objective-C由Smalltalk(消息型语言的鼻祖)演化而来,使用的是“消息结构”(messageing structure)而非"函数调用"(functioncalling),这两者之间的区别就像这样:
// Messaging (Objective-C)
Object *obj = [Object new];
[obj performWith: parameter1 and: parameter2];
// Function calling (C++)
Object *obj = new Object;
obj->perform(parameter1, parameter2);
- Objective-C 为C语言添加了对象特性,是其超集。Objective-C使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收一条消息之后,究竟应执行何种代码,由运行期环境而非编译器来决定。
- Objective-C语言中的指针是用来指示对象的,声明一个变量,令其指代某个对象的语法基本上是照搬C语言的。
NSString *someString = @"The string";
变量someString指向分配在堆里的某块内存,其中含有一个NSString的对象"The string"。另外Objective-C的对象分配总是分配在"堆空间"(heap space)中,有些不含有*的变量,它们可能会使用栈空间(stack space),例如CGRect类型的分配。而这些分配在"堆空间"的对象,需要内存管理(现在不用手动管理了)。
第2条:在类的头文件中尽量少引入其他的头文件
- 当不需要知道某个类的全部细节时,用
@class TheClass
,来替代#import "TheClass.h"
, 这叫做“向前声明”(forward declaring)该类。@class
的使用既可以减少不必要的导入,也可以避免头文件因互相import而编译通不过。
// EOCPerson.m
# import "EOCPerson.h"
// # import "EOCEmployer.h"
@class EOCEmployer;
@interface EOCPerson : NSObject
@property (nonatomic, strong) EOCEmployer *employer;
@end
将引入的头文件时机尽量延后,只在确有需要时才引入,这样就可以减少类的使用者所需引入的头文件数量, 减少编译时间。
# import "ViewController.h"
# import "EOCPerson.h"
# import "EOCEmployer.h"
@interface ViewController()
@end
@implementation
- (void)viewDidload {
[super viewDidload];
EOCPerson *person = [EOCPerson new];
EOCEmployer *employer = [EOCEmployer new];
employer.name = "Coder"; // 如果没有 # import "EOCEmployer.h"会编译报错
person.employer = employer;
}
@end
- 声明类遵循某个协议时,最好把协议单独放在一个头文件中,再来导入。然而有些协议,例如“委托协议”(delegate protocol),就不用单独写一个头文件了。在那种情况下,协议只有与接收协议委托的类放在一起定义才有意义。
网友评论