2026世界杯_2004年世界杯 - 1606811.com

首页 > 开幕式世界杯 > Objective-C面向对象编程:类、对象、方法详解(保姆级教程)

Objective-C面向对象编程:类、对象、方法详解(保姆级教程)

目录

一、核心概念

二、类的定义(分.h和.m文件)

[1. 头文件(.h)------ 公开声明](#1. 头文件(.h)—— 公开声明)

[2. 实现文件(.m)------ 具体实现](#2. 实现文件(.m)—— 具体实现)

[3. 属性特性解析](#3. 属性特性解析)

原子性

所有权语义(ARC环境下)

读写控制

三、对象创建与内存管理

[1. 创建对象的两种方式](#1. 创建对象的两种方式)

[2. 关键步骤解析](#2. 关键步骤解析)

[3. instancetype](#3. instancetype)

四、方法调用(消息传递机制)

[1. 基本语法](#1. 基本语法)

[2. 关键概念](#2. 关键概念)

五、self与super关键字

六、动手实践:完整工作流

[1. 创建Person对象并调用方法](#1. 创建Person对象并调用方法)

[2. 项目结构](#2. 项目结构)

七、关键概念对比表

八、常见问题解答

相关推荐

一、核心概念

类:对象的蓝图(定义属性和方法)

对象:类的实例(内存中的具体实体)

方法 :对象的行为(实例方法 - / 类方法 +)

二、类的定义(分.h和.m文件)

1. 头文件(.h)------ 公开声明

objectivec

复制代码

#import

@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)------ 具体实现

objectivec

复制代码

#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. 创建对象的两种方式

objectivec

复制代码

// 标准方式(推荐)

SccUser *user1 = [[SccUser alloc] init];

// 简化方式(等效于alloc+init)

SccUser *user2 = [SccUser new];

2. 关键步骤解析

方法

作用

alloc

分配内存(从堆区申请空间)

init

初始化对象(设置默认值)

✅ 最佳实践:自定义初始化方法示例

objectivec

复制代码

// 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. 基本语法

objectivec

复制代码

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对象并调用方法

objectivec

复制代码

#import

#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. 项目结构

objectivec

复制代码

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




饥荒联机版企鹅蛋怎么偷-企鹅蛋怎么偷攻略
Taylor Swift新专辑元35元/张,到底贵不贵?