目录

前言

Swift时代为何还要学Objective-C?

开发环境搭建

1. 安装Xcode

2. 创建第一个Command Line Tool项目

初识Objective-C代码

编写"Hello, Objective-C!"

编译运行程序

为什么Objective-C中的NSLog和NSString前面都有"NS"前缀?

"NS"的起源:NeXTSTEP操作系统

为什么保留"NS"前缀?

现代Objective-C中的命名变化

技术细节:NSLog vs printf

"NS"总结

相关推荐


前言

        在Swift已经成为苹果生态主流开发语言的今天,许多初学者可能会疑惑:为什么我们还需要学习"古老"的Objective-C?这篇博客将解答这个问题,并带你完成Objective-C开发环境的搭建,写出第一个"Hello, Objective-C!"程序。

Swift时代为何还要学Objective-C?

虽然Swift确实更现代、更安全,但学习Objective-C仍有其重要价值:

  1. 维护老项目需求:苹果生态中存在大量使用Objective-C编写的遗留代码,特别是企业级应用和大型项目

  2. 开源库兼容性:许多优秀的开源库仍然是用Objective-C编写的,理解OC能帮助你更好地使用和贡献这些项目

  3. 底层原理理解:Objective-C更接近底层,学习它可以帮助你深入理解iOS/macOS的运行时机制

  4. 面试加分项:许多技术面试仍会考察Objective-C相关知识,特别是对内存管理、runtime等底层原理的理解

开发环境搭建

我们将使用Xcode作为开发工具,它是苹果官方提供的集成开发环境(IDE)。

1. 安装Xcode

从Mac App Store搜索并安装Xcode,或者从苹果开发者网站下载。

安装完成后,打开Xcode,你可能还需要安装一些额外的命令行工具(Xcode会提示你)。

2. 创建第一个Command Line Tool项目

为了避免一开始就陷入复杂的UIKit框架,我们从简单的命令行工具开始:

  1. 打开Xcode,选择"Create a new Xcode project"

  2. 选择"macOS" → "Command Line Tool"

  3. 输入产品名称(如"HelloObjectiveC")

  4. 确保语言选择"Objective-C"

  5. 选择保存位置,点击"Create"

初识Objective-C代码

创建项目后,你会看到Xcode自动生成了一个main.m文件,这是程序的入口点。让我们解析一下其中的关键部分:

  • #import <Foundation/Foundation.h>:导入Foundation框架,它提供了OC的基础类和方法

  • @autoreleasepool:内存管理相关的自动释放池,我们后续会详细讲解

  • NSLog():相当于其他语言中的print/console.log,用于输出日志

  • @"字符串":Objective-C中的字符串字面量写法(注意@符号

编写"Hello, Objective-C!"

让我们修改自动生成的代码,输出我们自己的消息:

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {NSLog(@"Hello, Objective-C!");NSLog(@"这是我的第一个OC程序");}return 0;
}

编译运行程序

在Xcode中,点击左上角的"运行"按钮(或按⌘+R),你将在底部控制台看到输出:

恭喜!你已经成功完成了第一个Objective-C程序!

为什么Objective-C中的NSLog和NSString前面都有"NS"前缀?

在Objective-C开发中,你会频繁遇到以"NS"开头的类名和函数名,比如NSLogNSStringNSArray等。这个"NS"前缀其实有着重要的历史渊源和技术含义。

"NS"的起源:NeXTSTEP操作系统

"NS"是NeXTSTEP的缩写,这是由Steve Jobs在1985年离开苹果后创立的NeXT公司开发的操作系统环境:

  1. 历史背景

    • 1985年:Steve Jobs离开苹果,创立NeXT公司

    • 1988年:NeXT推出NeXTSTEP操作系统

    • 1996年:苹果收购NeXT,Steve Jobs回归

    • 2001年:Mac OS X发布,基于NeXTSTEP技术

  2. 技术传承

    • Objective-C语言在NeXTSTEP中被选为官方开发语言

    • 许多基础框架(如Foundation、AppKit)最初是为NeXTSTEP设计的

    • 这些框架中的类保留了"NS"前缀以示其来源

为什么保留"NS"前缀?

即使在苹果收购NeXT后,"NS"前缀仍然被保留下来,主要原因包括:

  1. 命名空间管理

    • Objective-C没有真正的语言级命名空间

    • 前缀可以避免类名冲突(如你的String类 vs 系统的NSString

  2. 历史兼容性

    • 保持与已有代码的兼容性

    • 开发者已经熟悉这些命名约定

  3. 框架标识

    • 可以直观看出类属于哪个框架

    • "NS"表示来自Foundation框架(NS = NeXTSTEP)

    • "UI"表示来自UIKit框架(iOS)

    • "CA"表示来自Core Animation框架

现代Objective-C中的命名变化

虽然"NS"前缀仍然广泛使用,但苹果在现代也有了一些变化:

  1. Swift中移除了大部分前缀(如String而不是NSString)

  2. 新框架使用新前缀(如WKWebView中的"WK"代表WebKit)

  3. 跨平台框架倾向于使用更中性的前缀(如MTKView中的"MTK"代表MetalKit)

技术细节:NSLog vs printf

NSLog为例,它比C语言的printf更强大:

// C语言风格
printf("Hello,World"); //不支持自动换行,需要自己手动\n// Objective-C风格
NSLog(@"Hello, World");  // 自动换行,带时间戳,进程号/线程号等

关键区别:

  • NSLog自动添加换行和时间戳

  • 使用%@格式化符来输出Objective-C对象

  • 字符串前需要加@符号(@"字符串"

"NS"总结

"NS"前缀是Objective-C和苹果开发历史的重要组成部分,它:

  • 源自NeXTSTEP操作系统

  • 在缺乏命名空间的Objective-C中解决命名冲突

  • 已经成为Cocoa/Cocoa Touch框架的标识特征

  • 即使在新语言Swift中,与Objective-C交互时仍能看到这些前缀

相关推荐

Flutter 路由与导航的详细使用-CSDN博客文章浏览阅读614次,点赞14次,收藏15次。本文详细介绍了Flutter路由与导航的使用,包括基本路由和命名路由的定义与使用、路由传参的多种方式、路由拦截与守卫的实现以及第三方路由库的应用。通过实例演示和代码解析,帮助开发者全面理解Flutter路由与导航的机制,掌握高效管理页面跳转和数据传递的技巧。 https://shuaici.blog.csdn.net/article/details/146084028Flutter Hero 组件详解及应用-CSDN博客文章浏览阅读1k次,点赞39次,收藏28次。Hero组件的核心功能是实现页面跳转时的共享元素动画(Shared Element Transition)。它通过在两个页面中定义相同的tag值,自动检测并创建平滑的过渡动画。 https://shuaici.blog.csdn.net/article/details/146083772

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86551.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86551.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86551.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu18.04安装 gcc 9以及2019版本tbb

一、安装gcc 9 ubuntu18.04默认是用的gcc7.5 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt-get install gcc-9 g-9 下面是配置优先用哪个版本的gcc和g &#xff0c;后面带的值越大越优先用谁&#xff0c;并且配置完全局生效不仅仅是在当…

JdbcUtils的三个版本以及sql注入问题

JDBC的工具类 1.0版本 JDBC的工具类 2.0版本&#xff08;智能一些&#xff09;&#xff0c;编写properties属性文件&#xff0c;程序就可以读取属性文件 JDBC的工具类 3.0版本&#xff0c;加入连接池对象 我们封装jdbc工具类是为了减少代码重复&#xff0c;方便开发&#xff0…

AS32系列MCU芯片I2C模块性能解析与调试

国科安芯推出的AS32X601内置的I2C模块提供了符合工业标准的两线串行制接口&#xff0c;可用于MCU和外部IIC设备的通讯。IIC总线使用两条串行线&#xff1a;串行数据线SDA和串行时钟线SCL。 IIC接口模块实现了IIC协议的标准模式和快速模式&#xff0c;支持多主机IIC总线架构。其…

钉钉小程序开发实战:打造一个简约风格的登录页面

在上一篇文章中&#xff0c;我们已经介绍了如何搭建钉钉小程序的基础环境&#xff0c;并完成了项目的初始化配置。本文将继续深入&#xff0c;手把手带你实现一个简约风格的登录页面&#xff0c;这是大多数企业级应用不可或缺的一部分。 钉钉小程序基于前端 Web 技术栈&#x…

论文研读2-1:多GNSS双历元纯相位定位-模型建立与误差分析

后续文章: 论文研读2-2&#xff1a;多GNSS双历元纯相位定位-固定模糊度精度增益 论文研读2-3&#xff1a;多GNSS双历元纯相位定位-定位精度分析 仅相位定位中的模糊度解算问题 在卫星导航定位中&#xff0c;载波相位测量是实现高精度定位的基础&#xff0c;但如果仅使用相位测…

Python----OpenCV(图像増强——图像平滑、均值滤波、高斯滤波、中值滤波、双边滤波)

Python----计算机视觉处理&#xff08;Opencv&#xff1a;图像噪点消除&#xff1a;滤波算法&#xff0c;噪点消除&#xff09; 一、图像平滑 图像平滑处理&#xff08;Smoothing Images&#xff09;&#xff0c;也称为图像模糊处理、图像滤波&#xff08;Images Filtering&am…

笔记:使用EasyExcel导入csv文件出现编码问题,导致导入数据全为null的解决方法

笔记&#xff1a;使用EasyExcel导入csv文件出现编码问题&#xff0c;导致导入数据全为null的解决方法 通常情况下&#xff0c;我们使用excel导入&#xff0c;但是部分情况下或者领导要求&#xff0c;我们需要使用csv导入文件&#xff0c;但是csv文件模板下载之后会变成系统当前…

NL2SQL(Natural Language to SQL)优化之道:提升准确率与复杂查询能力

自然语言 → SQL 的转译&#xff08;NL2SQL&#xff09;技术&#xff0c;是让非技术用户与数据库“对话”的桥梁。而在实际应用中&#xff0c;我们不仅需要“能转”&#xff0c;更要“转得准、转得全、转得快”。 一、什么是 NL2SQL&#xff1f; NL2SQL&#xff08;Natural La…

java中map的循环方式

什么是Map集合&#xff1f; Map是Java中的一个接口&#xff0c;它用于存储键-值对&#xff0c;并且键和值都可以是任意对象。它是Java集合框架中的一部分&#xff0c;并提供了一些方法来操作和访问Map中的元素。 Map中的每个键都是唯一的&#xff0c;这意味着不能使用相同的键…

python学习笔记(深度学习)

文章目录 1、概述2、学习内容2.1、pytorch 常见语法2.1.1、sum2.1.2、广播机制2.1.3、张量2.1.4、DataLoader 2.2、普通语法2.2.1、迭代器 1、概述 本篇博客用来记录&#xff0c;在深度学习过程中&#xff0c;常用的 python 语法内容 2、学习内容 2.1、pytorch 常见语法 2.…

力扣网C语言编程题:搜索二维矩阵(右上角->左下角解法)

一. 简介 上一篇文章关于"在二维数组中查找某个元素"的问题&#xff0c;提供了两种解题思路&#xff0c;文章如下&#xff1a; 力扣网C语言编程题&#xff1a;搜索二维矩阵的普通解法与二分查找法-CSDN博客 本文提供第三种解题思路&#xff1a;从左下角->右上角…

AI大模型流式输出,OkHttp Log拦截打印方案

背景&#xff1a; 使用okhttp框架进行网络访问时&#xff0c;一般会使用 HttpLoggingInterceptor 打印请求和响应的log。在使用okhttp访问AI大模型时&#xff0c;如果选择流式输出&#xff0c;那么响应的body数据使用的SSE技术&#xff0c;服务异步发送大模型生成的增量token&…

看数据世界的历史:全面梳理从关系库、大数据到AI时代的数据发展及展望

序章 在数据库不断发展的时代里&#xff0c;我们看到了关系型数据库&#xff08;RDB&#xff09;在一次次的数据演变过程中的占据王位&#xff0c;捍卫了胜利&#xff0c;像一个王朝更替下的“王权”的故事&#xff0c;精彩有趣。 本篇就来探讨下数据库的发展兴衰史&#xff0…

元宇宙与人工智能的融合:从虚拟世界到智能生态的IT新革命

文章目录 引言&#xff1a;前沿技术重塑数字交互体验一、元宇宙与AI融合的本质&#xff1a;虚拟空间与智能交互的交汇元宇宙赋能AI&#xff1a;AI赋能元宇宙&#xff1a; 二、元宇宙与AI融合的演进&#xff1a;从概念到产业热潮三、核心技术&#xff1a;元宇宙与AI融合的基石与…

问卷调查[mqtt dht]

任务 this code uses esp32-wroom-32 and dht11 to read the humidty and temperature, besieds, it will send the meassage to the cloud platform. All communication is conducted through MQTT. 打分标准 您应该对以下代码进行评级&#xff0c;并且必须遵守如…

swift 对象转Json

在 Swift 中将对象转换为 JSON 可以通过以下方法实现&#xff1a; 使用 Codable 协议 Swift 的 Codable 协议&#xff08;Encodable 和 Decodable 的组合&#xff09;是处理 JSON 编码和解码的推荐方式。 struct Person: Codable {var name: Stringvar age: Int }let person…

Python学习Day43

学习来源&#xff1a;浙大疏锦行 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt from PIL import Image import os # 设置随机…

了解一下Unity AssetBundle 的几种加载方式

Unity 的 AssetBundle 系统提供了多种加载方式&#xff0c;以满足不同场景下的资源管理和性能需求。 同步加载&#xff08;LoadFromFile&#xff09; 同步加载使用 AssetBundle.LoadFromFile 方法从文件系统中直接加载 AssetBundle。这种方式会阻塞主线程&#xff0c;直到加载…

鸿蒙边缘智能计算架构实战:多线程图像采集与高可靠缓冲设计

目录 一、技术背景与挑战二、鸿蒙边缘计算架构的核心特性1. 分布式软总线&#xff1a;打破设备孤岛2. 轻量化多线程模型 三、多线程图像采集的稳定性设计1. 分层缓冲队列架构2. 线程优先级策略 四、边缘侧高可靠缓冲机制1. 基于分布式数据管理的容错设计2. 动态带宽调节 五、实…

excel中vba开发工具

1、支持单元格点击出现弹框进行选择 支持模多次模糊查询 Private Sub CommandButton1_Click() Call vehicle_查询 End SubPrivate Sub Worksheet_Activate()Call vehicle_取出车架号和公司名称 取出不重复的车架号Sheet13.ComboBox1.Visible False 车架号显示Sheet13.ComboB…