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

【初识Objective-C】

Objective-C学习

  • 什么是OC
    • OC的特性
    • OC跑的第一个程序helloworld
  • OC的一些基础知识
    • 标识符
    • OC关键字
    • 数据类型
    • 字符型
      • c字符串
        • 为什么NSString类型定义时前面要加@
        • 和普通的c对象有什么区别
  • 一些基础知识
    • if语句
    • switch语句
    • 三种循坏语句
      • for循环:用于固定次数的循环
      • while循环:当满足某个条件时反复执行循环
    • do-while循环:与while循环类似,只是先执行一次循环体,然后再检查循环条件

什么是OC

  OC是Objective-C的缩写,它是一种在C语言的基础上扩展的面向对象编程语言。Objective-C在1980年代由Stepstone公司的Brad Cox和Tom Love开发。他们的目标是将一些面向对象的功能添加到C语言中,使软件开发更加灵活和模块化

OC的特性

  面向对象的特性:Objective-C支持类的概念,包括继承、封装和多态。它也支持动态类型和动态绑定。
  消息传递:Objective-C使用消息传递模型,而不是像大多数面向对象语言那样使用方法调用。这使得程序具有更大的灵活性,因为消息可以在运行时动态解析。
  Cocoa和Cocoa Touch:Objective-C是Apple开发OS X和iOS操作系统的主要语言,它们的主要应用程序框架Cocoa和Cocoa Touch是用Objective-C编写的。
  内存管理:Objective-C提供自动引用计数(ARC)来自动化内存管理,从而减少了手动内存管理的负担。

OC跑的第一个程序helloworld

// 导入Foundation框架
#import <Foundation/Foundation.h>// 主函数,程序入口
int main(int argc, const char * argv[]) {// 创建自动释放池,管理内存@autoreleasepool {// 打印输出"Hello, World!"NSLog(@"Hello, World!");}return 0;
}

 先导入了Foundation框架,然后定义了程序的入口点main函数。英文中的@autoreleasepool是一个自动释放池,它可以自动管理内存。NSLog函数用于在控制台输出字符串,类似于C语言的printf

OC的一些基础知识

标识符

 在Objective-C编程中,标识符是用来识别变量、函数、或任何其他用户定义的项目的名称。一个Objective-C标识符是一个字母或下划线开头的名字,后面跟着零个或多个字母、下划线和数字。注意,Objective-C是区分大小写的,所以在命名标识符时需要特别注意。
 Objective-C有两种类型的标识符:
内部标识符:这些标识符以一个字母或下划线开始,其后跟着任何数量的字母、数字或下划线。
外部标识符:这些标识符以一个字母开始,其后跟着任何数量的字母、数字或下划线。
 以下是一些Objective-C标识符的示例:
Valid: myVariableName, _myVariable, myVariable1
Not valid: 123myVariable (开头不能是数字), my Variable(不能包含空格), my-Variable(不能包含非数字/字母/下划线的字符)
 标识符的选择非常重要,一个好的标识符名称会让你的代码更容易阅读和理解。当选择标识符名称时,最好选择有意义的名称,让其他人阅读你的代码时能够理解他们的用途。
在这里插入图片描述

OC关键字

在这里插入图片描述

数据类型

 Objective-C支持C语言的所有基本数据类型,并添加了一些新的数据类型。以下是一些常见的数据类型:
整数类型:
—int:为一个整数,占用4个字节,取值范围通常为-2147483648至2147483647。
—short:为一个短整数,通常占用2个字节。
—long:为一个长整数,在64位系统中,占用8个字节,在32位系统中占用4个字节。
----long long:为一个长整数,占用8个字节。
无符号整数类型(它们都是正数或零):
—unsigned int
—unsigned short
—unsigned long
—unsigned long long
浮点类型:
—float:是一个浮点,占用4个字节。精确到小数点后6位左右。
—double:占用8个字节。精确到小数点后15位左右。
—long double:占用16个字节。
字符型:
—char:占用1个字节。可以存取单个字符。
其他:
—bool:布尔型。它可以取两个值,YES和NO。
—void:表示没有值或者类型。
—id:用于存储任意类型的对象。(类似Python的object或C++的auto)
 除了这些基本数据类型,Objective-C还支持对象类型,如NSString、NSArray、NSDictionary等等。还可以定义你自己的类作为新的数据类型使用。

字符型

 在Objective-C中,字符串是一串字符的集合。可以通过两种不同的方式处理字符串。

c字符串

C字符串:Objective-C继承于C语言,所以C字符串是允许的。一个C字符串以’\0’为结束标志。例如

char *myCString = "This is a C String";

NSString:这是Objective-C的字符串类,它提供了一组更加强大的字符串处理功能。
创建NSString对象的方法很多。您可以创建一个NSString对象并立即给它赋值。例如:

NSString *myString = @"This is an NSString object";

NSString类有很多方法可以对字符串进行操作,包括计算字符串长度、比较两个字符串、将字符串转换为大写或小写,等等。例如:

NSString *myString = @"Hello, World!";
NSUInteger myStringLength = [myString length];  // 获取字符串长度NSString *uppercaseString = [myString uppercaseString];  // 转换为大写if ([myString isEqualToString:@"Hello, World!"]) {NSLog(@"The strings are equal.");
} else {NSLog(@"The strings are not equal.");
}
为什么NSString类型定义时前面要加@

 在Objective-C中,@符号用于标记编译器指令。在你提供的示例str = @"5大于3"中,@是一个前缀,它告诉编译器将双引号内的文本视为一个NSString实例而非C语言的字符串。 所以,@"5大于3"实际上是创建了一个NSString对象,该对象包含文本“5大于3”。在Objective-C中,你通常会看到@用于这样的字符串定义,或者用于定义数字、字典、数组等。例如:

NSNumber *myNumber = @3;
NSArray *myArray = @[@1, @2, @3];
NSDictionary *myDict = @{@"key": @"value"};

在每种情况下,@都是告诉编译器创建一个Objective-C对象,而不是一个简单的C类型。

和普通的c对象有什么区别

 Objective-C是一种纯面向对象的程序设计语言,它在C语言的基础上增加了类和对象的概念。因此,Objective-C的对象和C语言中的简单数据类型或结构有一些明显的区别。
 对象与数据类型:在C语言中,我们通常处理的是简单的数据类型,如int、float、char等,以及复合的数据类型,如结构体(struct)。而在Objective-C中,我们处理的是对象,这些对象可能是字符串(NSString)、数字(NSNumber)、数组(NSArray)等。
 方法与函数:在C语言中,我们通过函数来操作数据。而在Objective-C中,我们使用对象的方法来进行操作。
 内存管理:Objective-C提供了对内存管理的更高级的抽象,通过引用计数和自动释放池(autorelease pools)来自动管理内存。而在C语言中,你必须手动地分配和释放内存。
 使用@符号:只有在Objective-C中我们才会看到@符号的使用,它用于创建不同类型的Objective-C对象。
 更多特性:Objective-C还提供了一些面向对象编程的高级特性,如继承、封装和多态。

一些基础知识

if语句

 Objective-C中的if语句用于根据特定的条件执行不同的代码段。其语法结构与C语言和其他许多编程语言相同:

if (condition) {// 这里是当条件为真(即,结果为YES)时执行的代码
}

还可以添加一个 else 部分来在条件为假时执行代码:

if (condition) {// 这里是当条件为真时执行的代码
} else {// 这里是当条件为假时执行的代码
}

可以使用 else if 来链接多个条件

if (condition1) {// 当条件1为真时执行的代码
} else if (condition2) {// 当条件1为假,但条件2为真时执行的代码
} else {// 当条件1和条件2都为假时执行的代码
}

让我们来看一个具体的示例。假设你有一个int型的变量score,你可以使用if-else语句来判断分数的等级:

int score = 85;if (score >= 90) {NSLog(@"Your grade is A.");
} else if (score >= 80) {NSLog(@"Your grade is B.");
} else if (score >= 70) {NSLog(@"Your grade is C.");
} else {NSLog(@"Your grade is F.");
}

switch语句

 在Objective-C中,switch语句用于根据表达式或变量的值选择多个代码块之一来执行。其基本语法如下:

switch (expression) {case value1:// 当表达式等于value1时执行的代码break;case value2:// 当表达式等于value2时执行的代码break;// 可以有任意数量的case语句default: // 当表达式的值与所有case都不匹配时执行的代码
}

需要注意的是,每一个case后面的代码块末尾通常都需要一个break语句,break语句的作用是跳出switch语句,防止代码进入下一个case。
 给你看一个具体的例子,假设有一个变量day代表星期几,你可以使用switch语句来打印出这一天的名称:

int day = 3; 
switch (day) {case 1:NSLog(@"Monday");break;case 2:NSLog(@"Tuesday");break;case 3:NSLog(@"Wednesday");break;case 4:NSLog(@"Thursday");break;case 5:NSLog(@"Friday");break;case 6:NSLog(@"Saturday");break;case 7:NSLog(@"Sunday");break;default:NSLog(@"You entered an invalid number for day of the week.");break;
}

三种循坏语句

for循环:用于固定次数的循环

    for (初始化; 循环条件; 循环后的操作) {// 循环执行的代码}

例如,打印从1到5的数字:

    for (int i = 1; i <= 5; i++) {NSLog(@"%d", i);}

while循环:当满足某个条件时反复执行循环

    while (循环条件) {// 循环执行的代码}

例如,打印小于等于5的数字:

    int i = 1;while (i <= 5) {NSLog(@"%d", i);i++;}

do-while循环:与while循环类似,只是先执行一次循环体,然后再检查循环条件

    do {// 循环执行的代码} while (循环条件);

例如,至少打印一次数字,然后再检查i是否小于等于5:

    int i = 1;do {NSLog(@"%d", i);i++;} while (i <= 5);

以上就是Objective-C中的三种主要的循环结构,它们各有应用场景,可以根据需要在代码中选用。

== 希望大家一起加油==

相关文章:

【初识Objective-C】

Objective-C学习 什么是OCOC的特性OC跑的第一个程序helloworld OC的一些基础知识标识符OC关键字数据类型字符型c字符串为什么NSString类型定义时前面要加和普通的c对象有什么区别 一些基础知识if语句switch语句三种循坏语句for循环&#xff1a;用于固定次数的循环while循环&…...

从功能性磁共振成像(fMRI)数据重建音频

听觉是人类最重要的感官之一&#xff0c;它负责接收外部的听觉刺激&#xff0c;并将这些信息传递给大脑进行处理和理解。研究人员正致力于从神经科学和计算机科学两个领域探索人脑的听觉感知机制。一个关键目标是从人脑中解码神经信息&#xff0c;并重建原始的刺激。常见的大脑…...

前端Vue小兔鲜儿电商项目实战Day04

一、二级分类 - 整体认识和路由配置 1. 配置二级路由 ①准备组件模板 - src/views/SubCategory/index.vue <script setup></script><template><div class"container"><!-- 面包屑 --><div class"bread-container">…...

TypeScript的简单总结

TypeScript 深度总结 引言 TypeScript&#xff0c;作为JavaScript的一个强类型超集&#xff0c;由Microsoft在2012年推出并维护至今&#xff0c;它不仅继承了JavaScript的所有特性&#xff0c;还引入了静态类型系统和其他现代编程特性&#xff0c;为开发者提供了一个更安全、…...

I.MX6ULL UART 串口通信实验

系列文章目录 I.MX6ULL UART 串口通信实验 I.MX6ULL UART 串口通信实验 系列文章目录一、前言二、I.MX6U 串口简介2.1 UART 简介2.2 I.MX6U UART 简介 三、硬件原理分析四、实验程序编写五、编译下载验证5.1编写 Makefile 和链接脚本5.2 编译下载 一、前言 不管是单片机开发还…...

systemctlm-cosim-demo项目分析

概述 systemctlm-cosim-demo项目是Xilinx的systemc库的demo工程。 环境安装 qemu安装 cd xilinx_proj/Downloads git clone https://github.com/Xilinx/qemu.git cd qemu git checkout 74d70f8008# Configure and build # zynq7000 # ./configure --target-list"arm-s…...

SQL学习小记(四)Navicat中连接Oracle数据库的详细步骤

五分钟解决Oracle连接问题&#xff1a;DPI-1047: Cannot locate a 64-bit Oracle Client library: “The specified module could not be SQL学习小记&#xff08;四&#xff09;Navicat中连接Oracle 1. 错误信息2. 解决过程2.1.版本查询2.2. 官网下载2.3. 设置Navicat的oci环…...

mysql聚簇索引

1.聚簇索引是物理索引&#xff0c;数据在表里是按顺序存储的&#xff0c;物理上是连续的&#xff0c;一般选主键id作为聚簇索引&#xff0c;且一张表里只能有一个聚簇索引。 2.只有InnoDB支持聚簇索引。 3.非聚簇索引是逻辑索引&#xff0c;将数据的某个字段抽取出来组成独立的…...

【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解

目录 引言 一、存储卷 &#xff08;一&#xff09;存储卷定义 &#xff08;二&#xff09;存储卷的作用 1.数据持久化 2.数据共享 3.解耦 4.灵活性 &#xff08;三&#xff09;存储卷的分类 1.emptyDir存储卷 1.1 定义 1.2 特点 1.3 示例 2.hostPath存储卷 2.1 …...

Adobe Premiere 专业视频编辑软件资源下载安装!pr 2024最新版软件分享

Adobe Premiere&#xff0c;作为一款非线性视频编辑软件&#xff0c;它打破了传统线性编辑的限制&#xff0c;为用户提供了更加灵活和自由的创作空间。 在电影制作领域&#xff0c;Adobe Premiere的出色表现赢得了众多导演和剪辑师的青睐。其强大的编辑功能使得影片的剪辑过程更…...

c++------类和对象(下)包含了this指针、构造函数、析构函数、拷贝构造等

文章目录 前言一、this指针1.1、this指针的引出1.2、 this指针的特性 二、类的默认的六个构造函数2.1、构造函数简述2.2构造函数 三、析构函数3.1、析构函数引出3.2、特点&#xff1a; 四、拷贝构造4.1、引入4.2、特征&#xff1a;4.3、默认拷贝构造函数 总结 前言 在本节中&a…...

git版本控制工具常用命令

一、本地仓库管理 push 向远程推送代码 pulll 拉取代码 二、远程仓库管理 三、分支操作 本地主分支master 远程主分支main head指向当前分支 查看&#xff1a;git branch 创建分支: git branch 名字 切换分支&#xff1a;git checkout 名字 合并分支&#xff1a;git…...

展示广告多模态召回模型:混合模态专家模型

✍&#x1f3fb; 本文作者&#xff1a;俊广、卓立、凌潼、青萤 1. 背景 随着在搜索、推荐、广告技术上多年的迭代积累&#xff0c;业界逐步形成了召回&#xff08;匹配&#xff09;、粗排、精排这一多阶段的系统架构。其中&#xff0c;召回作为链路的最前端&#xff0c;决定了业…...

好的一些网安资源

镜像&#xff1a;https://msdn.itellyou.cn/ 编程学习{ 菜鸟教程&#xff1a;https://www.runoob.com/ w3school&#xff1a;https://www.w3school.com.cn/ https://www.dotcpp.com/ http://zh.cppreference.com/ https://beginnersbook.com/ https://www.ai8py.com/ }…...

Linux chmod 命令

Linux chmod 命令 在 Linux 操作系统中&#xff0c;chmod 命令是非常重要的。它可以用于修改文件和目录的访问权限&#xff0c;以及控制用户对系统资源的访问。在这篇博客中&#xff0c;我们将深入探讨 chmod 命令的使用方法&#xff0c;以及如何使用它来管理文件和目录的访问…...

SDL教程(二)——Qt+SDL播放器

前言 ​ 这篇文章主要是使用SDL来打开视频&#xff0c;显示视频。后续会再继续使用SDL来结合FFmpeg。来能够直接使用网上的demo进行学习。 正文 一、环境 Qt 5.15.2 MSVC2019 64bit Win11 二、Qt搭建SDL Qt搭建&#xff0c;我觉得相比用VS2019来说&#xff0c;更为方便&…...

Java面试题:解决Redis缓存击穿问题

缓存击穿 当一个key过期时,需要对这个key进行数据重建 在重建的时间内如果有大量的并发请求进入,就会绕过缓存进入数据库,会瞬间击垮DB 重建时间可能因为数据是多个表的混合结果需要分头统计而延长,从而更容易出现缓存击穿问题 缓存击穿的解决方案 添加互斥锁 先查询缓存…...

Redis的哨兵模式

什么是哨兵模式 Redis的哨兵模式&#xff08; Sentinel mode &#xff09;是⼀个⾼可⽤解决⽅案&#xff0c;当运⾏多个 Redis 实例并且需要⾃动故障转移时&#xff0c;哨兵模式⾮常有⽤。 在⼀个典型的哨兵模式下&#xff0c;⾄少需要3 个哨兵实例来避免 “ 脑裂 ” &#xff…...

Hadoop伪分布式安装教程

Hadoop伪分布式安装教程 一、安装背景1.1 软件列表1.2 系统软件列表 二、安装Hadoop2.1 安装 Java 环境2.1.1 前期准备2.1.2 文件传输2.1.3 解压文件2.1.4 配置 jdk 的环境变量2.1.5 输入 java、javac、java -version 命令检验 jdk 是否安装成功 2.2 Hadoop 下载地址[hadoop](h…...

Day43 代码随想录打卡|二叉树篇---左叶子之和

题目&#xff08;leecode T404&#xff09;&#xff1a; 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 方法&#xff1a; 迭代法&#xff1a;计算所有的左叶子节点&#xff0c;那我们就必然要找到所有的左叶子节点。那么怎么找呢&#xff1f;如何针对cur->l…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...