第1条:了解Objective—C语言的起源

2017/1/13 posted in  第一章 熟悉oc

OC语言使用“消息结构”(messageing structure)而不是函数调用。OC是由Smalltalk演化而来。主要区别为:

//Messaging(OC)  

Object *obj = [Object new];  
[obj performWith:par1 and:par2];
   
//Function(C++)  

Object *obj = new Object;    
obj->perform(par1,par2);   

关键区别在于:使用消息结构的语言,其运行时所应执行的代码由运行环境所决定;而使用函数调用的语言,则由编译器决定。

所有的OC语言的对象都应该如下声明:

NSString *str = @“The string”;

因为所有的对象所占内存总是分配在“堆空间”中,而绝不会分配在“栈”(stack)上。一般变量分配在栈上。QQ20170112-0@2x

要点:
* OC为C语言添加了面向对象的特性,是它的超集。OC使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收一条消息之后,究竟应该执行何种代码,由运行时环境决定而不是编译器。
* 理解C语言的核心概念有助于写好OC程序。尤其是要掌握内存模型和指针。

第2条:在类的头文件中尽量少引入其它头文件

例如:
创建一个EOCPerson的类,其中属性中包含有EOCEmployer的类。

//EOCPerson.h
#import<Foundation/Foundation.h>
@interface EOCPerson:NSObject
@property (nonatomic,copy) NSString *firstname;
@property (nonatomic,copy) NSString *lastname;
@property (nonatomic,strong) EOCEmployer *employer;
@end

这样做常见的方法是在头部引入:

#import “EOCEmployer.h”

但是我们在这里不需要知道EOCEmployer这个类的全部细节,只需要知道这里有一个类就好。所以有一个方法为:

@class EOCEmployer;

这叫做前向声明。现在EOCPerson的头文件变为:

//EOCPerson.h
#import<Foundation/Foundation.h>

@class EOCEmployer;

@interface EOCPerson:NSObject
@property (nonatomic,copy) NSString *firstname;
@property (nonatomic,copy) NSString *lastname;
@property (nonatomic,strong) EOCEmployer *employer;
@end

但是EOCPerson类的实现文件则需要引入EOCEmployer类的头文件,因为知道其中所有的接口细节。于是,实现文件就是:

//EOCPerson.m
#import "EOCPerson.h";
#import "EOCEmployer.h"

@implementation EOCPerson
//.....
@end

要点:
* 除非的确有必要,否则不要引入头文件。一般来说,应该在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合。
* 有时无法使用向前声明,比如要声明某各类所遵循的一项协议,这种情况下,尽量吧“该类所遵循的协议“的这条声明移至”class-continuation分类“中。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。

第3条:多用字面量语法,少用与之等价的方法

从OC1.0开始,有一种非常简单的方式创建NSString对象。这就是”字符串字面量(string literal)“,其语法如下所示:

NSString *string = @”effective OC 2.0“;

如果不用这种语法的话,就要以常见的alloc以及init方法来分配和初始化对象了。

字面数值

有时候需要把整数、浮点数、布尔值封入OC对象中。这种情况下可以使用NSNumber类,该类可以处理多种类型的数值。最原始的创建方法为:

NSNumber *someNumber = [NSNumber numberWithInt:1];

上面这行代码创建了一个数字,将它的值设为了1.然而使用字面量能令代码更为整洁:

NSNumber *someNumber = @1;

字面量数组

创建方法为:

NSArray *animals =@[@"cat",@"dog",@"mouse",@"badger"];

使用字面量获取则为:

NSString *dog = animals[1];

字面量字典

”字典“(dictionary)是一种映射性数据结构,可以向其中添加键值对。与数组一样字面量编写方式为:

NSDictionary *personData = @{@"firstName":@"Matt",
                            @"lastName":@"Galloway",
                            @"age":@28}

可变数组与字典

通过取下标操作,可以访问数组中某个下标或者字典中某个键所对应的元素。如果数组与字典对象试课变得(mutable),那么也能通过下标修改其中的元素值。例如:

mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Galloway"; 

要点

  • 应该使用字面量语法来创建字符串、数值、数组、字典。与创建此类对象的常规方法相比,这么做更加简明扼要。
  • 应该通过下标来操作和访问数组小标或者字典中的键所对应的元素。
  • 用字面量语法创建数组或者字典时,若值中有nil,则会抛出异常。因此,务必保证值中不包含有nil。