首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 淺析:從語法基礎到 Runtime、內存管理、Block、協議與實戰面試題

     編輯:關於C語言

Objective-C 淺析:核心知識體系全景圖

Objective-C 是 C 的超集,加入 Smalltalk 風格消息機制、動態運行時、引用計數內存管理。本文將 50+ 核心知識點按模塊組織,兼顧語法速查與深度原理,並附高頻面試題解析。

模塊一:基礎語法與類結構

1. 類定義:介面 + 實現

// MyClass.h
@interface MyClass : NSObject
{
    @private
    NSString *_ivar;   // 實例變量,默認 @protected
}
- (void)instanceMethod;
+ (void)classMethod;
@property (copy) NSString *name;
@end

// MyClass.m
@implementation MyClass
@synthesize name = _name;  // 手動合成或自動合成
- (void)instanceMethod { ... }
+ (void)classMethod { ... }
@end

2. 核心關鍵字

關鍵字含義
id任意對象指針類型,已隱含 *
nil空對象指針,發送消息無效且安全
SEL方法選擇器 (方法名唯一標識,編譯期生成)
IMP方法實現函數指針 id (*IMP)(id, SEL, ...)
Class類對象指針
BOOL/YES/NO布爾類型 (signed char)

3. 消息機制 [receiver message]

  • 編譯器轉為 objc_msgSend(receiver, @selector(message))
  • 動態查找:receiver->isa->cache → methodLists → superclass
  • nil 接收者安全無崩潰,返回 0/nil/結構體零值

模塊二:Runtime 核心

4. 類對象結構體

struct objc_class {
    Class isa;                    // 指向 metaclass
    Class super_class;            // 父類
    const char *name;             // 類名
    struct objc_ivar_list *ivars; // 實例變量列表
    struct objc_method_list **methodLists; // 方法列表
    struct objc_cache *cache;     // 方法緩存 (SEL→IMP)
    struct objc_protocol_list *protocols;
};

5. Metaclass 體系

  • 實例 isa → 類對象 (存實例方法/變量)
  • 類對象 isa → Metaclass (存類方法)
  • 所有 Metaclass isa → 根 Metaclass (NSObject)
  • 根 Metaclass isa → 自身

6. 消息轉發三階段

  1. 動態方法解析:+resolveInstanceMethod: / +resolveClassMethod: 動態添加實現
  2. 備用接收者:-forwardingTargetForSelector: 轉發給其他對象
  3. 完整轉發:-methodSignatureForSelector: + -forwardInvocation: 構造 NSInvocation 任意處理

模塊三:內存管理 (MRC/ARC)

7. 引用計數規則 (MRC)

操作計數變化所有權
alloc/new/copy/mutableCopy+1你擁有
retain+1你擁有
release-1 (歸零觸發 dealloc)放棄擁有
autorelease延遲 -1 (當前 AutoreleasePool 銷毀時)暫時擁有

8. @property 屬性修飾符

@property (nonatomic, strong) NSString *name;   // ARC 默認 strong
@property (nonatomic, copy)   NSString *label;  // 防可變對象副作用
@property (nonatomic, assign) NSInteger count;  // 基本類型/弱引用
@property (nonatomic, weak)   id delegate;      // 打破循環引用
@property (readonly)           NSInteger hash;  // 僅 getter

9. ARC 核心規則

  • 強引用 (strong) = retain;弱引用 (weak) = 不增加計數,對象釋放自動置 nil。
  • __weak / __strong / __unsafe_unretained / __autoreleasing 修飾變量。
  • Block 截獲對象默認 strong,需 __weak typeof(self) weakSelf = self; 打破循環。

模塊四:進階特性

10. Block 閉包

void (^block)(int) = ^(int x) { return x * 2; };
// 截獲局部變量默認按值複製;__block 修飾可修改外部變量
// Block 類型:_NSConcreteStackBlock / _NSConcreteMallocBlock / _NSConcreteGlobalBlock

11. 協議與代理


@protocol MyDelegate 
@required - (void)requiredMethod;
@optional  - (void)optionalMethod;
@end

@interface A : NSObject
@property (weak) id delegate;
@end

// B 實現協議,A.delegate = b; [a.delegate requiredMethod];

12. 分類 vs 擴展

CategoryExtension (Class Extension)
可向現有類添加方法 (無需源碼)僅在 .m 文件中聲明私有屬性/方法
不能添加實例變量 (關聯對象除外)可添加實例變量 (編譯期佈局)
方法可選實現方法必須實現 (否則編譯警告)

13. KVC / KVO

  • KVC:[obj valueForKey:@"name"] / [obj setValue:@"" forKey:@"name"] 通過字符串訪問屬性
  • KVO:觀察者模式,[obj addObserver:observer forKeyPath:@"name" options:0 context:NULL]

模塊五:高頻面試題精選

  1. 多重繼承? 無,用 Protocol + 代理組合實現多態。
  2. 私有方法/變量? 變量默認 @protected,可用 @private;方法無私有,用 Category/Extension 模擬。
  3. C/C++/OC 混編? .m 編譯 OC/C;.mm 編譯 OC/C/C++;C++ 頭文件不可含 OC 語法,用 extern "C" 隔離。
  4. 目標-動作機制? 控件存 target/action,事件觸發時 [target performSelector:action]。
  5. #import vs #include? #import 自動防重複包含;@class 前向聲明減少編譯依賴。
  6. 內存管理口訣? 「你創建/保留/複製 → 你釋放」;autorelease 延遲釋放,適合工廠方法返回值。
  7. 淺/深拷貝? 淺拷貝複製指針 (引用計數+1);深拷貝分配新內存複製內容 (如 mutableCopy/archive/unarchive)。
  8. 動態運行時含義? 類型綁定、方法調用、消息轉發均推遲到運行時,支撐多態、動態添加方法、Swizzling。
  9. 棧 vs 堆? 棧:編譯器管理、LIFO、~8MB、高效;堆:手動管理、任意大小/生命周期、碎片、較慢。

模塊六:開發生態

組件角色類比
XcodeIDEVisual Studio
Objective-C語言C++/Java/C#
Cocoa / Cocoa Touch框架庫 (Foundation, AppKit/UIKit, CoreData...).NET Framework / JDK / MFC

小結

Objective-C = C 語法 + Smalltalk 消息 + 動態 Runtime + 引用計數內存。
掌握 isa/元類/消息轉發/ARC/Block/協議/Category 六大支柱,配合 Xcode/Instruments/LLDB 工具鏈,即可駕馭 iOS/macOS 系統級開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved