Objective-C 在 C 基礎上增加了 Smalltalk 風格的消息傳遞、動態運行時、Foundation 框架。本文面向 C 開發者,快速建立 OC 基礎語法直覺:BOOL 陷阱、集合遍歷、NSString/文件操作、消息語法、核心術語。
#import <Foundation/Foundation.h>
// 正確:返回 BOOL 字面量
BOOL areIntsDifferent(int a, int b) {
return (a == b) ? NO : YES; // 不要 return a - b;
}
// 安全轉字符串
NSString *boolStr(BOOL b) {
return b ? @"YES" : @"NO";
}
int main() {
@autoreleasepool {
NSLog(@"%@", boolStr(areIntsDifferent(6,6))); // NO
NSLog(@"%@", boolStr(areIntsDifferent(29,48))); // YES
}
return 0;
}
if (flag == YES) — YES=1,但非零即真,flag=2 時判斷失敗。if (flag) / if (!flag) / if (flag == NO) (NO=0 唯一)。BOOL 實為 signed char,非 _Bool。int main() {
@autoreleasepool {
int count = 3;
NSLog(@"0 到 %d:", count);
for (int i = 0; i <= count; ++i) {
NSLog(@"%d", i);
}
}
return 0;
}
int main() {
@autoreleasepool {
const char *c_arr[] = {@"hello", @"zhangting", @"latitude", @"longitude"};
for (int i = 0; i < 4; ++i) {
// C 風格
NSLog(@"C: %s len=%lu", c_arr[i], strlen(c_arr[i]));
// OC 風格 (UTF-16 代碼單元數)
NSString *oc = [NSString stringWithUTF8String:c_arr[i]];
NSLog(@"OC: %@ length=%lu", oc, [oc length]);
}
}
return 0;
}
int main() {
@autoreleasepool {
FILE *fp = fopen("/tmp/test.txt", "r");
if (!fp) return 1;
char line[256];
while (fgets(line, sizeof(line), fp)) {
// fgets 保留 \n,手動去除
line[strcspn(line, "\n")] = '\0';
NSString *oc = [NSString stringWithUTF8String:line];
NSLog(@"%@ length=%lu", oc, [oc length]);
}
fclose(fp);
}
return 0;
}
// [receiver message] → objc_msgSend(receiver, @selector(message)) [array addObject:obj]; // 無參數 [dict setObject:obj forKey:key]; // 多參數 (冒號分隔) [obj performSelector:@selector(foo)]; // 動態選擇器
| 術語 | 含義 | C++ 對應 |
|---|---|---|
| 消息 | 方法調用的動態分發請求 | 虛函數調用 |
| 方法 | 響應消息的代碼實現 (IMP) | 成員函數 |
| 選擇器 | 方法名的唯一標識 (SEL) | 函數指針/符號 |
| 協議 | 方法列表契約 (@protocol) | 純虛類/Concept |
| 類別 | 運行時為現有類添加方法 | 無直接對應 |
| 接口 | .h 文件聲明的公共 API | 頭文件類聲明 |
| 實現 | .m 文件的方法體 | .cpp 定義 |