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

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)

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

开源 Objective-C IOS 应用开发(七)Objective-C核心代码示例

开源 Objective-C IOS 应用开发(八)常见控件UI

开源 Objective-C IOS 应用开发(九)复杂控件-tableview

开源 Objective-C IOS 应用开发(十)数据持久化--文件

开源 Objective-C IOS 应用开发(十一)数据持久化--sqlite

开源 Objective-C IOS 应用开发(十二)通讯--ble

开源 Objective-C IOS 应用开发(十三)通讯--Http访问

开源 Objective-C IOS 应用开发(十四)传感器--陀螺仪和gps

开源 Objective-C IOS 应用开发(十五)通讯--蓝牙ble扫描

开源 Objective-C IOS 应用开发(十六)Storyboard模式下的纯代码界面

开源 Objective-C IOS 应用开发(十七)CAF音频的录制

开源 Objective-C IOS 应用开发(十八)音频的播放

开源 Objective-C IOS 应用开发(十九)视频的播放

开源 Objective-C IOS 应用开发(二十)多线程处理

开源 Objective-C IOS 应用开发(二十一)自定义控件--示波器

开源 Objective-C IOS 应用开发(二十二)自定义控件--车速仪表盘

 推荐链接:

开源 Arkts 鸿蒙应用 开发(一)工程文件分析-优快云博客

开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-优快云博客

开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-优快云博客

开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-优快云博客

开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-优快云博客

开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储-优快云博客

开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库-优快云博客

开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机-优快云博客

开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端-优快云博客

开源 Arkts 鸿蒙应用 开发(十)通讯--Http-优快云博客

开源 Arkts 鸿蒙应用 开发(十一)证书和包名修改-优快云博客

开源 Arkts 鸿蒙应用 开发(十二)传感器的使用-优快云博客

开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放_arkts avplayer播放音频 mp3-优快云博客

开源 Arkts 鸿蒙应用 开发(十四)线程--任务池(taskpool)-优快云博客

开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘-优快云博客

开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图-优快云博客

开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载-优快云博客

开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器-优快云博客

推荐链接:

开源 java android app 开发(一)开发环境的搭建-优快云博客

开源 java android app 开发(二)工程文件结构-优快云博客

开源 java android app 开发(三)GUI界面布局和常用组件-优快云博客

开源 java android app 开发(四)GUI界面重要组件-优快云博客

开源 java android app 开发(五)文件和数据库存储-优快云博客

开源 java android app 开发(六)多媒体使用-优快云博客

开源 java android app 开发(七)通讯之Tcp和Http-优快云博客

开源 java android app 开发(八)通讯之Mqtt和Ble-优快云博客

开源 java android app 开发(九)后台之线程和服务-优快云博客

开源 java android app 开发(十)广播机制-优快云博客

开源 java android app 开发(十一)调试、发布-优快云博客

开源 java android app 开发(十二)封库.aar-优快云博客
 

本章内容主要对Objective-C 和C语言进行一个对比,方便快速学习。

Objective-C 是 C 语言的超集。这意味着:

  • 所有合法的 C 语言代码,在 Objective-C 环境中完全有效。

  • Objective-C 在 C 的基础上添加了面向对象的特性,其核心是一个基于消息的、运行时的面向对象机制。

目录:

1.语法对比

2.学习路线

3.完整示例

4.总结

一、语法对比

1. 面向对象 vs 面向过程

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

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

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

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

4. 字符串: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!"];

5. 内存管理

  • C 语言:手动管理,malloc() / free()

  • Objective-C:

    • MRC:手动引用计数,需要手动 retainreleaseautorelease

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


二、学习路线

1. 理解基本语法结构

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

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

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

2. 掌握面向对象核心

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

  2. 定义属性:熟练使用 @property,理解 strongweakassign 等关键字。

  3. 创建对象:

    objective-c

    // 传统方式
    Person *person1 = [[Person alloc] init];
    // 使用自定义初始化方法
    Person *person2 = [[Person alloc] initWithName:@"Alice" age:25];

3. 熟悉 Foundation 框架常用类

这是 Cocoa Touch 的基础,就像 C 的标准库。

  • 字符串:NSStringNSMutableString

  • 集合:

    • 数组:NSArray (不可变), NSMutableArray (可变)

    • 字典:NSDictionary (不可变), NSMutableDictionary (可变)

  • 数值:NSNumberNSIntegerCGFloat

示例:

// 数组
NSArray *fruits = @[@"Apple", @"Banana", @"Orange"];
NSString *firstFruit = fruits[0]; // 下标访问

// 字典
NSDictionary *personInfo = @{@"name": @"Bob", @"age": @30}; // @30 将基本数据类型转为NSNumber对象
NSString *name = personInfo[@"name"];

4. 理解 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 键单击它,可以快速查看文档。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值