基礎
- OC 是消息型語言,C 是函數調用型
- 消息型語言,動態綁定(dynamic binding),運行時執行的代碼由運行時組件(runtime component)決定,運行時才會檢查對象類型
- 運行時組件本質上是一種與開發者所編代碼相鏈接的動態庫(dynamic library),其代碼能把開發者編寫的所有程序粘合起來
- 對象所占內存分配在 “堆(heap space)”,指針所占內存分配在“棧(stack space)”,結構體也分配在棧上
- 使用結構體比對象更節省性能,因為對象需要分配內存和釋放內存等開銷
重點
- 在.h 文件中盡量少引用其他頭文件,減少編譯時間并且規避引用循環
- 如果只是聲明屬性的話,使用
@class
( 前向聲明,forward declearing),如果需要聲明遵守的協議,可以在類擴展里聲明
- 協議最好單獨放在一個文件中,如果放在一個類里,那么想引用協議,就需要引入這個類,增加了編譯時間
- 多用類型常量少用#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
- 枚舉
- 使用枚舉來表示狀態、選項
- 用枚舉定義選項時,如果選項可組合,那么將選項定義成2的冪
#import <Foundation/Foundation.h>
// 用枚舉表示狀態碼、錯誤碼、選項
// 定義可組合選項時,將選項定義為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;
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。