二者的区别就像下面这样:
//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对象所占内存总是分配在“堆空间”中,而绝不会分配在“栈”上。
NSString *something = @"The string";
而不能写成这样:
NSString *something;
#import "Person.h"
只需要:
@class Person;
这叫做“向前声明
”该类。
实现文件需要使用到Person类中的所有接口细节,所以就需要引入Person类的头文件。将引入头文件的时机尽量延后,只在有需要时引入,
这样就可以减少类的使用者所需引入的头文件数量,减少编译时间。
要声明某个类遵循一项协议
,这种情况下,最好吧“该类遵循某协议”的这条声明转移至“class-continuation分类”中;如果不行的话,就把协议单独放在一个头文件中,然后引入。优点:实用字面量语法可以缩减源代码长度,使其更为易读,利于操作,可以避免因为有nil的存在导致的程序崩溃。
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.14159;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @'a';
int x = 5;
float y = 6.32f;
NSNumber *experssionNumber = @(x * y);
NSArray *animals = @[@"dog", "cat", "mouse"];
NSString *dog = animals[0];
//创建字面量数组
id object1 = @"dog";
id object2 = nil;
id object3 = object1;
NSArray *array1 = [NSArray arrayWithObjects:object1,object2,object3,nil];
NSArray *array2 = @[object1, object2, object3];
以上两种创建方法,第一种不会报错,但是数组array1只有一个元素就是:object1,因为使用“arrayWithObjects”方法时会依次处理各个参数,直到发现nil为止,所以该方法会提前停止;当使用字面量语法创建时,因为object2是nil,所以会抛出异常。
NSDictionary *personData = @{@"firstName":@"Jack",
@"lastName":@"Galloway",
@"age":@28};
//字典中的对象和键都必须是Objective-C对象,所以得将“28”封装在NSNumber实例中才行。
//访问字典中的键:
NSString *lastName = personData[@"lastName"];
修改可变数组与字典内容的标准做法是:
mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Galloway";
实用字面量语法创建出来的字符串、数组、字典对象都是不可变的。
若想要可变的对象,则需要复制一份。
NSMutableArray *mutable = [@[@1, @2, @3, @4] mutableCopy];
没有类型信息
,所以尽量使用下面的语法定义常量:static const NSTimeInterval kAnimationDuration = 0.3;
变量一定要同时用static与const来声明
。当试图修改由const修饰符所声明的变量,编译器就会报错,而static修饰符则意味着该变量仅在定义此变量的编译单元内可见。那么就将各选项值定义为2的幂,以便通过按位或操作将其组合起来
。用NS_ENUM与NS_OPTIONS宏来定义 枚举类型,并指明其底层数据类型
。这样做可以确保枚举是用开发者所选的底层数据类型实现出来的,而不会采用编译器所选的类型。不要实现default分支
。这样,加入新枚举后就会提示开发者:switch语句并未处理所有枚举。