开源 Objective-C IOS 应用开发(六)Objective-C 和 C语言

文章的目的为了记录使用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.总结

一、语法对比

  1. 面向对象 vs 面向过程
  • C 语言是面向过程的,程序由函数和数据结构组成。

  • Objective-C 是面向对象的,程序由类、对象和方法组成。

  1. 方法调用:消息传递 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);

  1. 类的定义:接口 (.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

  1. 字符串:NSString vs char *
特性 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!"];

  1. 内存管理
  • C 语言:手动管理,malloc() / free()

  • Objective-C:

    • MRC:手动引用计数,需要手动 retain, release, autorelease

    • ARC:自动引用计数,编译器自动在合适的地方插入内存管理代码。Xcode 新项目默认使用 ARC,极大简化了开发。


二、学习路线

  1. 理解基本语法结构

  2. 导入头文件:用 #import 代替 #include,它能自动防止重复包含。

  3. 日志输出:用 NSLog(@"Format", args...) 代替 printf(...)%@ 是对象的格式化符。

  4. 消息语法:反复练习 [Object Message] 的写法。

  5. 掌握面向对象核心

  6. 创建类:练习创建 .h.m 文件,声明 @interface@implementation

  7. 定义属性:熟练使用 @property,理解 strong, weak, assign 等关键字。

  8. 创建对象:

    objective-c

    // 传统方式

    Person *person1 = [[Person alloc] init];

    // 使用自定义初始化方法

    Person *person2 = [[Person alloc] initWithName:@"Alice" age:25];

  9. 熟悉 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"];

  1. 理解 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

注意点:

  1. 不要抗拒方括号:[object method] 是 Objective-C 的灵魂,很快你就会习惯。

  2. 善用 Xcode 的自动完成:输入 [obj 后按 Esc,Xcode 会列出所有可能的消息。

  3. 查阅 Apple 官方文档:对于任何不熟悉的类(如 NSString),按住 Option 键单击它,可以快速查看文档。

相关推荐
数式Oinone12 小时前
继荣获GitCode G-Star认证后,数式Oinone入选2025年GitCode百大开源项目
低代码·开源·低代码平台·gitcode·数式oinone
DisonTangor12 小时前
FIBO是首个基于长结构化描述训练、专为JSON设计的开源文本生成图像模型。
语言模型·自然语言处理·ai作画·开源
亲爱的马哥13 小时前
开源推荐 | TDuck 社区版 — 企业级表单系统分享
开源
数式Oinone13 小时前
社区投稿 | Oinone应用于整车制造供应链决策
低代码·开源·制造·低代码平台·数式oinone
纵有疾風起14 小时前
C++—vector:vecor使用及模拟实现
开发语言·c++·经验分享·开源·stl·vector
CoderJia程序员甲15 小时前
GitHub 热榜项目 - 日榜(2025-11-12)
ai·开源·大模型·github·ai教程
算家计算16 小时前
PaddleOCR-VL-vLLM-OpenAI-API使用教程来了!手把手教你搞定文档解析
人工智能·开源
迦蓝叶17 小时前
Apache Jena 知识图谱持久化:选择适合你的存储方案
人工智能·开源·apache·知识图谱·持久化·存储·jena