当前位置: 首页 > news >正文

开源 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 是面向对象的,程序由类、对象和方法组成。

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);
}
@endint 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 键单击它,可以快速查看文档。

http://www.dtcms.com/a/605768.html

相关文章:

  • 网站栅格安装网站模版视频
  • PHP While 循环
  • Docker 部署 DeepSeek-OCR 和WebUI
  • 长沙h5网站建设什么软件可以发布广告信息
  • 如何保证数据库与 Redis 的数据一致性
  • redis连接服务
  • Linux systemd闲谈杂话(第一篇:概述)
  • Spring 核心技术解析【纯干货版】- XII:Spring 数据访问模块 Spring-R2dbc 模块精讲
  • 手机什么网站可以设计楼房关于网站建设的调查问卷
  • 零基础网站建设教学申请自己邮箱域名
  • JVM 内存结构、堆细分、对象生命周期、内存模型全解析
  • 网络安全编程——基于Python实现的SSH通信(Windows执行)
  • WAF防护:应用层安全的核心堡垒
  • 【OpenCV图像处理】图像去噪:cv.fastNlMeansDenoising()
  • 基于AI Agent模板:快速生成 SQL 测试数据
  • 无锡网站建设方案企业计划书
  • 做购票系统网站网站开发推广方案策划书
  • JVM GC 垃圾回收体系完整讲解
  • JVM 内存结构的详细介绍
  • Linux命令-egrep命令(文本搜索工具)
  • 《Flutter全栈开发实战指南:从零到高级》- 14 -网络请求与数据解析
  • 模板网站配置文件seo难不难
  • div2 1052 个人补题笔记
  • 【1.10】基于FPGA的costas环开发4——鉴相器模块开发
  • C语言编译软件 | 如何选择适合自己的编译器
  • 怎么做网站外贸wordpress 本地 域名绑定
  • DSP中断工作原理
  • 【LeetCode】109. 有序链表转换二叉搜索树
  • Verilog 利用伪随机,时序,按键消抖等,实现一个(打地鼠)游戏
  • 【音视频】均衡器(Equalizer)技术详解