基礎
- OC 是消息型語言背伴,C 是函數調用型
- 消息型語言,動態(tài)綁定(dynamic binding)峰髓,運行時執(zhí)行的代碼由運行時組件(runtime component)決定傻寂,運行時才會檢查對象類型
- 運行時組件本質上是一種與開發(fā)者所編代碼相鏈接的動態(tài)庫(dynamic library),其代碼能把開發(fā)者編寫的所有程序粘合起來
- 對象所占內存分配在 “堆(heap space)”携兵,指針所占內存分配在“棧(stack space)”疾掰,結構體也分配在棧上
- 使用結構體比對象更節(jié)省性能,因為對象需要分配內存和釋放內存等開銷
重點
- 在.h 文件中盡量少引用其他頭文件徐紧,減少編譯時間并且規(guī)避引用循環(huán)
- 如果只是聲明屬性的話静檬,使用
@class
( 前向聲明,forward declearing)浪汪,如果需要聲明遵守的協(xié)議巴柿,可以在類擴展里聲明
- 協(xié)議最好單獨放在一個文件中,如果放在一個類里死遭,那么想引用協(xié)議,就需要引入這個類凯旋,增加了編譯時間
- 多用類型常量少用#define 預處理命令呀潭。類型常量語義更清晰,并且可以預處理命令不必要的替換(#define會影響所有引入包含該命令頭文件的文件)
.h
#import <Foundation/Foundation.h>
// const 表示常量至非,不可修改
// static 表示只在當前文件中可見
// extern 表示對外可見钠署,放在全局符號表中(global symbol table)
// !!!對外可見的常量需要先在.h 中聲明,再在.m 中定義荒椭,并使用類名作為前綴谐鼎,防止與其他符號沖突!!!
extern const NSInteger ZWQConstantNumber; // .h 中聲明對外可見的常量
@interface ZWQConstant : NSObject
@end
.m
#import "ZWQConstant.h"
static const NSString *kName = @"ZWQ"; // 只對內可見的常量
const NSInteger ZWQConstantNumber = 1; // 在.m 中定義對外可見的常量
@implementation ZWQConstant
@end
- 枚舉
- 使用枚舉來表示狀態(tài)、選項
- 用枚舉定義選項時趣惠,如果選項可組合狸棍,那么將選項定義成2的冪
#import <Foundation/Foundation.h>
// 用枚舉表示狀態(tài)碼身害、錯誤碼、選項
// 定義可組合選項時草戈,將選項定義為2的冪塌鸯,使用“|”按位或組合,使用“&”按位與驗證
// 需要組合的枚舉使用 NS_OPTIONS唐片,不需要組合的枚舉使用 NS_ENUM
// 在 switch()語句中如果用來判斷枚舉值丙猬,最好不加 default 分支,這樣在增加新枚舉值時费韭,編譯器會提示增加 switch 分支
// 使用默認編號(不需要組合茧球,使用 NS_ENUM)
typedef NS_ENUM(NSUInteger,ZWQOption){
ZWQOptionA, // 0
ZWQOptionB, // 1
ZWQOptionC, // 2
} ;
// 指定編號(不需要組合,使用 NS_ENUM)
typedef NS_ENUM(NSUInteger,ZWQState){
ZWQStateA = 100,
ZWQStateB = 200,
ZWQStateC = 300,
} ;
// 可組合選項星持,定義為2的冪抢埋,使用“|”按位或組合,使用“&”按位與驗證(需要組合钉汗,使用 NS_OPTIONS)
typedef NS_OPTIONS(NSUInteger,ZWQDirection){
ZWQDirectionUp = 1 << 0,
ZWQDirectionDown = 1 << 1,
ZWQDirectionLeft = 1 << 2,
ZWQDirectionRight = 1 << 3
} ;
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 用 switch 判斷枚舉值
ZWQOption option = ZWQOptionA;
switch (option) {
case ZWQOptionA:
NSLog(@"%@",@"ZWQOptionA");
break;
case ZWQOptionB:
NSLog(@"%@",@"ZWQOptionB");
break;
case ZWQOptionC:
NSLog(@"%@",@"ZWQOptionC");
break;
}
// 判斷可組合枚舉值
ZWQDirection direction = ZWQDirectionUp | ZWQDirectionDown | ZWQDirectionLeft | ZWQDirectionRight;
if ( (direction & ZWQDirectionUp) && (direction & ZWQDirectionDown) && (direction & ZWQDirectionLeft ) && (direction & ZWQDirectionRight) ) {
NSLog(@"%@",@"所有方向");
}
}
return 0;
}