Objective-C面向對象編程:類、對象、方法詳解(保姆級教程)

目錄

一、核心概念

二、類的定義(分.h和.m文件)

1. 頭文件(.h)—— 公開聲明

2. 實現文件(.m)—— 具體實現

3.??屬性特性解析

原子性

所有權語義(ARC環境下)

讀寫控制

三、對象創建與內存管理

1. 創建對象的兩種方式

2. 關鍵步驟解析

3.?instancetype

四、方法調用(消息傳遞機制)

1. 基本語法

2. 關鍵概念

五、self與super關鍵字

六、動手實踐:完整工作流

1. 創建Person對象并調用方法

2. 項目結構

七、關鍵概念對比表

八、常見問題解答

相關推薦


一、核心概念

  1. :對象的藍圖(定義屬性和方法)
  2. 對象:類的實例(內存中的具體實體)
  3. 方法:對象的行為(實例方法?-?/ 類方法?+

二、類的定義(分.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和setter
  • readonly:只生成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?的對比(核心區別)

特性instancetypeid(通用對象指針)
類型安全性? 編譯器會檢查類型一致性? 繞過類型檢查
代碼智能提示? 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++的thisself.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:allocinit能分開調用嗎?

可以但不推薦(可能產生未初始化對象):

Person *p = [Person alloc];  // 只有內存分配
p = [p init];                // 完成初始化

Q3:方法命名規范?

蘋果官方要求:

  • 參數名嵌入方法名(sendData:toAddress:withTimeout:
  • 駝峰命名法(首個單詞小寫)

Q4:如何理解消息傳遞?

Objective-C運行時動態綁定過程:

  1. 通過isa指針查找對象類
  2. 在類的方法列表中查找SEL
  3. 若未找到則向父類傳遞消息
  4. 最終未處理則觸發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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86666.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS 7 編譯ClickHouse 24.8完整指南

前言 在CentOS 7上編譯ClickHouse 24.8可能會遇到一些挑戰&#xff0c;主要是因為CentOS 7的默認軟件版本較舊。本文將詳細介紹從零開始構建ClickHouse 24.8的完整過程&#xff0c;包括依賴安裝和環境配置。 準備工作 首先確保系統已更新到最新版本&#xff1a; yum update…

Protocol Buffers (Protobuf) 全面解析

一、核心概念解析 1. 什么是數據序列化&#xff1f; #mermaid-svg-HZKw9iRlpQIRFiO3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HZKw9iRlpQIRFiO3 .error-icon{fill:#552222;}#mermaid-svg-HZKw9iRlpQIRFiO3 .…

高斯混合模型GMMK均值(十三-1)——K均值是高斯混合模型的特例

EM算法與K均值算法的關系 K均值可以看成是高斯混合模型的特例。 對K均值算法與EM算法進行比較后&#xff0c;可以發現它們之間有很大的相似性。K均值算法將數據點硬&#xff08;hard&#xff09;分配到聚類中&#xff0c;每個數據點唯一地與一個聚類相關聯&#xff0c;而EM算法…

StarRocks 向量索引如何讓大模型“記性更好”?

隨著 ChatGPT、DeepSeek 等大語言模型的普及&#xff0c;我們已經能夠與 AI 進行流暢的對話。然而&#xff0c;即使是最先進的大模型也面臨著“記憶困境”&#xff0c;具體表現模型只能記住訓練時接觸的知識&#xff0c;且這些知識在使用時很可能會過期。實際應用或在處理特定領…

UniApp Vue3 模式下實現頁面跳轉的全面指南

1. 引言 1.1 UniApp 與 Vue3 的結合優勢 UniApp 是一個使用 Vue.js 開發所有前端應用的框架,支持編譯到 iOS、Android、H5、以及各種小程序平臺。Vue3 提供了更高效的響應式系統和 Composition API,使開發體驗更加現代化和靈活。 1.2 頁面跳轉在應用開發中的重要性 頁面跳…

Solidity學習 - ABI 應用二進制接口

文章目錄 一、ABI 基礎概念1. ABI 與 API 的區別2. ABI 的核心作用 二、ABI 接口描述1. 編譯后的產物2. ABI JSON 格式示例3. ABI JSON 關鍵字段說明 三、ABI 編碼1. 編碼示例2. 編碼數據的組成3. Solidity 中的編碼函數 四、ABI 解碼1. 解碼的基本概念2. 事件日志的解碼 五、A…

星際爭霸數據集指南

星際爭霸作為檢驗AI效果的一個重要“模式生物”, 是驗證AI技術的重要平臺?&#xff0c;尤其在 深度學習 和 強化學習領域。該游戲因其復雜的游戲機制和實時決策要求&#xff0c;為AI研究提供了豐富的測試環境和挑戰。 本博文是記錄自己曾經研究星際爭霸AI時對于數據部分的一點…

VUE組件與組件之間的傳參

每次啟動vue2項目的時候在 vue.config.js中配置&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,//關閉語法嚴格檢驗lintOnSave:false})1&#xff1a;在 src 下 創建 utils 文件夾 然后創建 Bas…

8年java開發從零學習人工智能(深度學習)--pp飛槳(百度自研開源框架)

1.明確概念&#xff1a;人工智能>機器學習>深度學習&#xff0c;三者的關系是包含關系&#xff0c;如圖所示&#xff1a; 人工智能&#xff08;AI&#xff09;&#xff0c;很寬泛的概念&#xff0c;是研發用于模擬&#xff0c;延展和擴展人的智能的理論&#xff0c;方法&…

ci | cd

ci | cd 相當于開發人員和運維人員共同完成的東西 ci:Jenkins cd:k8s ci &#xff1a; 持續集成 開發人員寫出的代碼提交到共享倉庫 比如說Git 自動觸發代碼檢查 測試 好處&#xff1a; 很快的發現bug 代碼不用堆積 cd: 持續交付&#xff1a;代碼測試沒問題后 自動打包…

深入理解C#委托操作:添加、移除與調用全解析

關鍵詞&#xff1a;委托不可變性 多播委托 調用列表管理 ?? 一、委托的核心特性&#xff1a;不可變性 看似“添加”&#xff0c;實為新建 使用 為委托“添加”方法時&#xff08;如 delVar SCl.m3;&#xff09;&#xff1a; 系統創建全新委托對象新委托的調用列表 原…

Spring Cloud:微服務架構的基石與實踐指南

一、Spring Cloud 核心組件 &#xff08;一&#xff09;Spring Cloud Netflix Spring Cloud Netflix 是 Spring Cloud 的核心模塊之一&#xff0c;它集成了 Netflix 的多個開源組件&#xff0c;提供了微服務架構中常見的功能&#xff0c;如服務注冊與發現、配置中心、API 網關…

【VPX3U】國產嵌入式平臺:RK3588J×JH930硬件架構與紅外應用方案

隨著對邊緣計算與多媒體處理需求的提升&#xff0c;國產異構平臺成為關鍵發展方向。最近有一個項目需求&#xff0c;提出了一款基于瑞芯微 RK3588J 處理器與景嘉微GPU 的 VPX3U 規格嵌入式主板的設計想法旨在融合高性能異構計算與豐富的視頻、網絡和存儲接口&#xff0c;適用于…

秩序密碼-用群論分析魔方的階

三階魔方的物理基礎是由一個三維十字軸連接的 6 個中心塊&#xff0c;這 6 個中心塊決定了魔方的 6 種顏色朝向&#xff0c;構成不動的坐標系統&#xff0c;此外還有兩類活動塊&#xff0c;分別是8個角塊&#xff0c;12個棱塊。 魔方的每一層轉動&#xff08;如 R: 右層順時針…

Python驅動自動駕駛的“多眼”——打造高效傳感器融合框架的實戰思考

Python驅動自動駕駛的“多眼”——打造高效傳感器融合框架的實戰思考 最近,自動駕駛行業火得不行,背后支撐它的技術,遠不止車載攝像頭那么簡單。真正讓車“看懂”世界的,是多種傳感器數據的“融合”,包括雷達、激光雷達(LiDAR)、攝像頭、慣性測量單元(IMU)等等。 而如…

機器學習-- 聚類

什么是聚類&#xff1f; Clustering 可以簡單地說&#xff0c;對有標注的數據分類&#xff0c;就是邏輯回歸&#xff08;屬于有監督分類&#xff09;&#xff0c;對無標注的數據分類&#xff0c;就是聚類&#xff08;屬于無監督分類&#xff09; 聚類是一種無監督學習技術&am…

【Yonghong 企業日常問題08 】永洪BI的Apache Tomcat版本升級指南

文章目錄 前言操作步驟登錄驗證 前言 某公司業務永洪BI系統使用tomcat 9.0.97版本&#xff0c;接到總公司漏洞掃描整改要求需要將tomcat版本升級到9.0.97以上。 目標&#xff1a;tomcat 9.0.97》 9.0.98 1、下載tomcat所需要的版本 地址:https://tomcat.apache.org/download-…

BigFoot RaidSlackCheck11.109.zip lua

BigFoot RaidSlackCheck11.109.zip lua 合劑buff檢查插件 把lua腳本拷貝到游戲插件目錄下&#xff1a; D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns 命令 /rsc 下載地址&#xff1a; https://download.csdn.net/download/spencer_tseng/91181827

深入解析前端 Meta 標簽:HTML 的隱形守護者與功能大師

在構建現代網頁時&#xff0c;我們常常關注炫目的視覺效果、復雜的交互邏輯或強大的框架&#xff0c;卻容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 標簽。這些標簽如同網頁的隱形守護者&#xff0c;無聲地承擔著定義文檔元數據、指導瀏覽器行為、優化搜…

青少年編程與數學 01-012 通用應用軟件簡介 11 應用商店

青少年編程與數學 01-012 通用應用軟件簡介 11 應用商店 一、什么是應用商店&#xff08;一&#xff09;應用商店的基本定義&#xff08;二&#xff09;應用商店的工作原理&#xff08;三&#xff09;應用商店的類型 二、應用商店的重要意義&#xff08;一&#xff09;為用戶提…