文章的目的为了记录使用Objective-C 进行IOS app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。
相关链接:
开源 Objective-C IOS 应用开发(一)macOS 的使用
开源 Objective-C IOS 应用开发(二)Xcode安装
开源 Objective-C IOS 应用开发(三)第一个iPhone的APP
开源 Objective-C IOS 应用开发(四)Xcode工程文件结构
开源 Objective-C IOS 应用开发(五)iOS操作(action)和输出口(Outlet)
推荐链接:
开源 Arkts 鸿蒙应用 开发(一)工程文件分析-CSDN博客
开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-CSDN博客
开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-CSDN博客
开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-CSDN博客
开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-CSDN博客
开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储-CSDN博客
开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库-CSDN博客
开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机-CSDN博客
开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端-CSDN博客
开源 Arkts 鸿蒙应用 开发(十)通讯--Http-CSDN博客
开源 Arkts 鸿蒙应用 开发(十一)证书和包名修改-CSDN博客
开源 Arkts 鸿蒙应用 开发(十二)传感器的使用-CSDN博客
开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放_arkts avplayer播放音频 mp3-CSDN博客
开源 Arkts 鸿蒙应用 开发(十四)线程--任务池(taskpool)-CSDN博客
开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘-CSDN博客
开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图-CSDN博客
开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载-CSDN博客
开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器-CSDN博客
推荐链接:
开源 java android app 开发(一)开发环境的搭建-CSDN博客
开源 java android app 开发(二)工程文件结构-CSDN博客
开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客
开源 java android app 开发(四)GUI界面重要组件-CSDN博客
开源 java android app 开发(五)文件和数据库存储-CSDN博客
开源 java android app 开发(六)多媒体使用-CSDN博客
开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客
开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客
开源 java android app 开发(九)后台之线程和服务-CSDN博客
开源 java android app 开发(十)广播机制-CSDN博客
开源 java android app 开发(十一)调试、发布-CSDN博客
开源 java android app 开发(十二)封库.aar-CSDN博客
本章内容主要对Objective-C 和C语言进行一个对比,方便快速学习。
Objective-C 是 C 语言的超集。这意味着:
-
所有合法的 C 语言代码,在 Objective-C 环境中完全有效。
-
Objective-C 在 C 的基础上添加了面向对象的特性,其核心是一个基于消息的、运行时的面向对象机制。

目录:
1.语法对比
2.学习路线
3.完整示例
4.总结
一、语法对比
- 面向对象 vs 面向过程
-
C 语言是面向过程的,程序由函数和数据结构组成。
-
Objective-C 是面向对象的,程序由类、对象和方法组成。
- 方法调用:消息传递 vs 函数调用
这是两种语言最显著的区别。
| 特性 | C 语言 | Objective-C |
|---|---|---|
| 形式 | 函数调用 | 消息传递 |
| 语法 | function(arg1, arg2); |
[receiver message:arg1 withArg:arg2]; |
| 解析时机 | 编译时决定 | 运行时决定(更灵活,支持动态绑定) |
示例对比:
// C语言:函数调用
printf("Hello, %s!", name); // 调用函数,传递参数
int result = calculateArea(10, 20);
// Objective-C:消息传递
NSString *myString = @"World";
// 向 myString 对象发送 `stringByAppendingString:` 消息
NSString *greeting = [myString stringByAppendingString: @"!"];
// 向 NSLog 函数发送消息,传递格式化字符串和参数
NSLog(@"Hello, %@", greeting);
- 类的定义:接口 (
.h) 与实现 (.m)
Objective-C 将类的声明和实现分开在两个文件中。
C 语言 使用 struct 来组织数据,行为(函数)是独立的。
Objective-C 使用 @interface 和 @implementation。
Person.h (头文件/接口文件)
objective-c
// 导入基础头文件
#import <Foundation/Foundation.h>
// 声明 Person 类,继承自 NSObject (几乎所有ObjC类的根类)
@interface Person : NSObject
// 属性声明 (自动生成setter/getter方法)
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
// 方法声明
- (void)introduce; // 实例方法 (- 号开头)
- (void)species; // 类方法 (+ 号开头,类似C++的静态方法)
// 自定义初始化方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;
@end
Person.m (实现文件)
// 导入自己的头文件
#import "Person.h"
@implementation Person
// 方法的实现
- (void)introduce {
// 使用属性,self 指向当前对象(类似C++的this)
NSLog(@"Hello, my name is %@ and I'm %ld years old.", self.name, (long)self.age);
}
- (void)species {
NSLog(@"I am a Person.");
}
// 初始化方法实现
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
self = [super init]; // 调用父类初始化
if (self) {
_name = name; // 可以直接访问实例变量(自动由@property生成)
_age = age;
}
return self;
}
@end
- 字符串:
NSStringvschar *
| 特性 | C 语言 | Objective-C |
|---|---|---|
| 类型 | char * (字符数组) |
NSString * (对象) |
| 创建 | char *str = "Hello"; |
NSString *str = @"Hello"; |
| 功能 | 基础操作,需手动管理内存 | 丰富的API(比较、分割、查找、格式化等) |
示例:
objective-c
// C 字符串
char cString[] = "C String";
// Objective-C 字符串
NSString *objcString = @"Objective-C String";
NSString *fullString = [objcString stringByAppendingString: @" is powerful!"];
- 内存管理
-
C 语言:手动管理,
malloc()/free()。 -
Objective-C:
-
MRC:手动引用计数,需要手动
retain,release,autorelease。 -
ARC:自动引用计数,编译器自动在合适的地方插入内存管理代码。Xcode 新项目默认使用 ARC,极大简化了开发。
-
二、学习路线
-
理解基本语法结构
-
导入头文件:用
#import代替#include,它能自动防止重复包含。 -
日志输出:用
NSLog(@"Format", args...)代替printf(...)。%@是对象的格式化符。 -
消息语法:反复练习
[Object Message]的写法。 -
掌握面向对象核心
-
创建类:练习创建
.h和.m文件,声明@interface和@implementation。 -
定义属性:熟练使用
@property,理解strong,weak,assign等关键字。 -
创建对象:
objective-c
// 传统方式
Person *person1 = [[Person alloc] init];
// 使用自定义初始化方法
Person *person2 = [[Person alloc] initWithName:@"Alice" age:25];
-
熟悉 Foundation 框架常用类
这是 Cocoa Touch 的基础,就像 C 的标准库。
-
字符串:
NSString,NSMutableString -
集合:
-
数组:
NSArray(不可变),NSMutableArray(可变) -
字典:
NSDictionary(不可变),NSMutableDictionary(可变)
-
-
数值:
NSNumber,NSInteger,CGFloat
示例:
// 数组
NSArray *fruits = @[@"Apple", @"Banana", @"Orange"];
NSString *firstFruit = fruits[0]; // 下标访问
// 字典
NSDictionary *personInfo = @{@"name": @"Bob", @"age": @30}; // @30 将基本数据类型转为NSNumber对象
NSString *name = personInfo[@"name"];
- 理解
id类型和nil
-
id:是一种通用的对象类型,可以指向任何类的对象(类似void *,但更安全)。objective-c
id unknownObject = ...; // 可以接受任何对象
-
nil:指向一个不存在的对象。向nil发送消息是安全的,什么也不会发生(不像C/C++会崩溃)。
三、完整的示例
C 和 Objective-C 的风格:
C 语言版本:
#include <stdio.h>
#include <string.h>
struct Person {
char name[50];
int age;
};
void introduce(struct Person *p) {
printf("Hello, my name is %s and I'm %d years old.\n", p->name, p->age);
}
int main() {
struct Person person;
strcpy(person.name, "John");
person.age = 30;
introduce(&person);
return 0;
}
Objective-C 版本:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
- (void)introduce;
@end
@implementation Person
- (void)introduce {
NSLog(@"Hello, my name is %@ and I'm %ld years old.", self.name, (long)self.age);
}
@end
int main() {
@autoreleasepool { // 自动释放池,用于内存管理
Person *person = [[Person alloc] init];
person.name = @"John";
person.age = 30;
[person introduce];
}
return 0;
}
四、总结:从 C 到 Objective-C 的思维转变
| 思维模式 | C 语言 | Objective-C |
|---|---|---|
| 数据与行为 | 分离(结构体 + 函数) | 封装(类 = 属性 + 方法) |
| 调用方式 | "调用一个函数" | "向一个对象发送消息" |
| 字符串 | 字符数组 | 功能丰富的对象 |
| 核心数据结构 | 数组、结构体 | 容器类(NSArray, NSDictionary) |
| 错误处理 | 返回值 | 异常、NSError、@try-@catch |
注意点:
-
不要抗拒方括号:
[object method]是 Objective-C 的灵魂,很快你就会习惯。 -
善用 Xcode 的自动完成:输入
[obj后按 Esc,Xcode 会列出所有可能的消息。 -
查阅 Apple 官方文档:对于任何不熟悉的类(如
NSString),按住 Option 键单击它,可以快速查看文档。