目錄
一、核心概念
二、類的定義(分.h和.m文件)
1. 頭文件(.h)—— 公開聲明
2. 實現文件(.m)—— 具體實現
3.??屬性特性解析
原子性
所有權語義(ARC環境下)
讀寫控制
三、對象創建與內存管理
1. 創建對象的兩種方式
2. 關鍵步驟解析
3.?instancetype
四、方法調用(消息傳遞機制)
1. 基本語法
2. 關鍵概念
五、self與super關鍵字
六、動手實踐:完整工作流
1. 創建Person對象并調用方法
2. 項目結構
七、關鍵概念對比表
八、常見問題解答
相關推薦
一、核心概念
- 類:對象的藍圖(定義屬性和方法)
- 對象:類的實例(內存中的具體實體)
- 方法:對象的行為(實例方法?
-
?/ 類方法?+
)
二、類的定義(分.h和.m文件)
1. 頭文件(.h)—— 公開聲明
#import <Foundation/Foundation.h>@interface SccUser : NSObject // 繼承NSObject// 屬性聲明(編譯器自動生成getter/setter)
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;// 方法聲明
- (void)sayHello; // 實例方法
+ (void)run; // 類方法@end
編譯器的自動合成:
- 自動生成實例變量(默認帶下劃線前綴:
_name
,?_age
) - 自動生成getter和setter方法
- 根據屬性特性自動處理內存管理
2. 實現文件(.m)—— 具體實現
#import "SccUser.h"@implementation SccUser- (void)sayHello {NSLog(@"say:HelloKitty");
}+ (void)run {NSLog(@"奔跑吧,類方法。");
}@end
3.??屬性特性解析
屬性特性分為三類:原子性、所有權語義和讀寫控制。
原子性
atomic
(默認):線程安全的getter/setter,但性能稍低nonatomic
:非線程安全,但性能更好(推薦在單線程環境使用)
所有權語義(ARC環境下)
特性 | 適用類型 | 描述 |
---|---|---|
strong | 對象類型 | 默認值,保持強引用,引用計數+1 |
weak | 對象類型 | 弱引用,不增加引用計數,對象釋放后自動置nil(解決循環引用) |
assign | 基本數據類型 | 簡單賦值,不進行引用計數管理(用于int, float, BOOL等) |
copy | 對象類型(特別是NSString/NSArray等) | 創建對象的副本(保護不可變對象不被外部修改) |
unsafe_unretained | 對象類型 | 類似assign,但對象釋放后不自動置nil(不安全,盡量用weak代替) |
讀寫控制
readwrite
(默認):生成getter和setterreadonly
:只生成getter
三、對象創建與內存管理
1. 創建對象的兩種方式
// 標準方式(推薦)
SccUser *user1 = [[SccUser alloc] init]; // 簡化方式(等效于alloc+init)
SccUser *user2 = [SccUser new];
2. 關鍵步驟解析
方法 | 作用 |
---|---|
alloc | 分配內存(從堆區申請空間) |
init | 初始化對象(設置默認值) |
??最佳實踐:自定義初始化方法示例
// SccUser.h中添加
- (instancetype)initWithName:(NSString *)name;// SccUser.m中實現
- (instancetype)initWithName:(NSString *)name {self = [super init];if (self) {_name = name; // 直接訪問底層實例變量}return self;
}
3.?instancetype
instancetype
?是 Objective-C 引入的編譯時類型檢查關鍵字,用于表示:
"這個方法返回的實例類型,就是當前類的類型"
與?id
?的對比(核心區別)
特性 | instancetype | id (通用對象指針) |
---|---|---|
類型安全性 | ? 編譯器會檢查類型一致性 | ? 繞過類型檢查 |
代碼智能提示 | ? Xcode 提供精確的代碼補全 | ? 只能提示通用方法 |
繼承場景行為 | ? 子類繼承時自動匹配實際類型 | ? 永遠返回?id |
編譯時優化 | ? 編譯器可進行靜態分析 | ? 無優化 |
四、方法調用(消息傳遞機制)
1. 基本語法
SccUser *user = [SccUser new];
// 無參數方法
[user sayHello];// 類方法
[SccUser run];// 帶參數方法(冒號是語法關鍵)
[user setName:@"ShuaiciMain"]; // 等效于user.name = @"ShuaiciMain";// 多參數方法
[user userInfo:@"DaShuaiCi" is:18];
2. 關鍵概念
- 選擇器(SEL):
@selector(sayHello)
?表示方法簽名 - 消息傳遞:
[receiver message]
?被編譯為objc_msgSend(receiver, selector)
五、self與super關鍵字
關鍵字 | 作用 | 示例 |
---|---|---|
self | 當前對象(類似Java/C++的this ) | self.name = @"Bob"; |
super | 調用父類實現 | [super init]; |
???易錯點:在
init
方法中必須用_name
訪問屬性,避免觸發未初始化的KVO
六、動手實踐:完整工作流
1. 創建Person對象并調用方法
#import <Foundation/Foundation.h>
#import "SccUser.h"int main(int argc, const char * argv[]) {@autoreleasepool {// 1. 創建對象SccUser *alice = [[SccUser alloc] init];// 2. 設置屬性(點語法本質是調用setter)alice.name = @"ShuaiciMain";// 3. 調用實例方法[alice sayHello];[alice userInfo:@"DaShuaiCi" is:18];// 4. 調用類方法[SccUser run];// 5. 使用自定義初始化SccUser *shuaici = [[SccUser alloc] initWithName:@"DaShuaiCi"];NSLog(@"自定義初始化:%@",shuaici.name);}return 0;
}
2. 項目結構
YourProject/
├── Person.h // 頭文件(聲明)
├── Person.m // 實現文件
└── main.m // 程序入口
七、關鍵概念對比表
特性 | 實例方法 | 類方法 |
---|---|---|
語法符號 | - (減號) | + (加號) |
調用對象 | 類的實例 | 類本身(如[Person ...] ) |
內存歸屬 | 對象內存空間 | 類元數據空間 |
訪問權限 | 可訪問實例變量 | 不可訪問實例變量 |
典型用途 | 對象的具體操作 | 工廠方法/工具類方法 |
八、常見問題解答
Q1:為什么屬性用copy
修飾字符串?
防止NSMutableString被意外修改(
copy
會創建不可變副本)
Q2:alloc
和init
能分開調用嗎?
可以但不推薦(可能產生未初始化對象):
Person *p = [Person alloc]; // 只有內存分配 p = [p init]; // 完成初始化
Q3:方法命名規范?
蘋果官方要求:
- 參數名嵌入方法名(
sendData:toAddress:withTimeout:
)- 駝峰命名法(首個單詞小寫)
Q4:如何理解消息傳遞?
Objective-C運行時動態綁定過程:
- 通過
isa
指針查找對象類- 在類的方法列表中查找SEL
- 若未找到則向父類傳遞消息
- 最終未處理則觸發
unrecognized selector
異常
相關推薦
為何要學習Objective-C?從環境搭建開始-CSDN博客文章瀏覽閱讀514次,點贊10次,收藏10次。在Objective-C開發中,你會頻繁遇到以"NS"開頭的類名和函數名,比如NSLog、NSString、NSArray等。這個"NS"前綴其實有著重要的歷史淵源和技術含義。https://shuaici.blog.csdn.net/article/details/148535298C語言基礎精講-CSDN博客文章瀏覽閱讀10w+次,點贊413次,收藏2.1k次。C語言是當代人學習及生活中的必備基礎知識,應用十分廣泛,下面為大家帶來C語言基礎知識梳理總結,C語言零基礎入門絕對不是天方夜譚!_c語言基礎知識
https://shuaici.blog.csdn.net/article/details/60570837