main函数的一些操作

article/2025/10/3 9:42:13

系列文章目录

第一章 OC之单例模式
第二章 OC之对象初始化
第三章 OC之类和协议
第四章 OC之main函数中的操作和一些概念


文章目录

  • 系列文章目录
  • 前言
  • 一、main函数的一些操作
  • 二 属性和成员变量
  • 三 ==和isEqual
  • 四 分类和拓展
  • 五 NSString的三种类型
    • 1._NSCFConstantString
    • 2._NSCFString
    • 3.NSTaggedPointerString
  • 六 深浅拷贝
    • 1.常见的字符串的深浅复制
    • 2.容器类完全深拷贝


前言

本篇介绍OC中关于mian函数的一些操作和一些概念

一、main函数的一些操作

#import"XiyouMobilePerson.h"
#import"Model.h"
#import"XiyouMobilePerson.h"
#import<Foundation/Foundation.h>
NSString* NSCollectionToString (NSArray* array) {NSMutableString* result = [NSMutableStringstringWithString: @"["];for (id obj in array) {[result appendString:[obj description]];[result appendString:@","];}NSUInteger len = [result length];[result deleteCharactersInRange : NSMakeRange (len-2, 2)];return result;
}
int main() {@autoreleasepool {XiyouMobilePerson* p1 = [[XiyouMobilePerson alloc]init];[p1 setiOS : 99];XiyouMobilePerson* p2 = [[XiyouMobilePerson alloc]init];[p2 setiOS : 97];XiyouMobilePerson* p3 = [[XiyouMobilePerson alloc]init];[p3 setiOS : 95];XiyouMobilePerson* p4 = [[XiyouMobilePerson alloc]init];[p4 setiOS : 93];XiyouMobilePerson* p5 = [[XiyouMobilePerson alloc]init];[p5 setiOS : 91];Model* m = [[Model alloc]init];m.XiyouMobileArrey = [NSMutableArray arrayWithArray: @[p1,p2,p3,p4,p5]];NSLog(@"%d %d %d %d %d", [p1 getiOS], [p2 getiOS], [p3 getiOS], [p4 getiOS], [p5 getiOS]);NSMutableArray* a = [m.XiyouMobileArrey sortedArrayUsingComparator : ^(id obj1, id obj2){if ([obj1 getiOS] > [obj2 getiOS]) {return NSOrderedDescending;}if ([obj1 getiOS] < [obj2 getiOS]) {return NSOrderedAscending;}return NSOrderedSame;}];NSLog(@"%d", [a[4] getiOS]);
}
}

结果:
在这里插入图片描述

二 属性和成员变量

使用@property声明一个成员变量时,会自动为其分配setter,getter方法。那么属性和成员变量有什么区别呢?

@property(nonatomic,copy)NSString* num;

当我们这样定义一个属性时,系统会自动为其分配一个_num的成员变量,并且系统会自动为其分配setter,getter方法,我们在.m文件中不仅可以直接使用_num的值,还可以通过self.num来访问这个属性。

那成员变量是怎样的?

//成员变量的声明
@interface XXXXXX{NSString* num;
}
//属性的定义
@property (nonatomic,copy)NSString* name;
@end;
//
@implementation.  

属性对应的,一定有setter,getter方法,主要是对成员变量赋值,取值的。而成员变量,真的只是一个变量。

三 ==和isEqual

它们两个都是用来判断值是否相等的方法。(==是运算符,isEqual是方法)

==

使用==来判断两个变量是否相等时,如果两个变量是基本类型的变量,则值相同即返回真,如果是指针类型的变量,只有它们指向同一个地址时才返回真。

注意使用==来判断时有字符串长度和内容和字符串类型的不同会产生不同结果。可见此博客的5.6部分

isEqual

使用isEqual来判断两个变量是否相等时,只要它们的字符串序列相等即返回真。

四 分类和拓展

分类不能添加属性,拓展可以添加属性

分类

分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。所以原则上它只能添加方法不能添加属性(成员变量),实际上可以通过其他方法来添加属性
分类中可以写@property,因为分类中没有属性列表,不会自动生成setter/getter方法,也不会生成实现以及私有的成员变量。(编译时会警告)
同名方法的调用优先级:分类>子类>父类
如果多个分类中都有和原有类方法同名的方法,那么调用该方法的时候执行谁由编译器决定。编译器会执行最后一个参与编译的方法。

拓展

拓展是分类的一个特例,拓展和分类相比只缺少了分类的名称,所以称之为“匿名分类”
拓展中的私有属性和私有方法必须实现

区别

类别原则上只能添加方法(添加属性需要解决无setter/getter方法的问题)
扩展可以添加方法和属性和实例变量,实例变量默认是@private
类别中的方法可以不实现,但是扩展中的方法必须实现,否则会警告。

五 NSString的三种类型

类型:

  1. _NSCFConstantString
  2. _NSCFString
  3. NSTaggedPointerString

1._NSCFConstantString

指一种常量字符串,是一种编译时的常量。存储在字符常量区。是一种创建后便无法释放掉的对象。给不同对象创建内容相同的字符串时,它不会被重复创建

NSString* str = @"hello";

当我们这样创建字符串时,它的类型就是_NSCFConstantString

2._NSCFString

一种在运行时创建的NSString子类,它并不是一种字符串常量,所以和其他对象一样在创建时获得了1的引用计数。
如果字符串长度满足要求,不论其创建方式,都会呢被创建成为_NSCFString类型

NSString* str = [NSStringt stringWithFormat:@"hello world"];

这样创建字符串时,它的类型就是_NSCFString

3.NSTaggedPointerString

理解这个类型,需要明白什么是标签指针,这是苹果在64位环境下对NSString,NSNumber等对象做的优化
把指针指向的内容直接放在了指针变量的内存地址中
这个也是一个释放不掉的单例常量对象。如果我们使用不同的字符串对象进行创建,内容相同时,地址也相同。
对于NSString对象来说,当非字面值常量的数字,英文字母字符串的长度小于9时(含有q小于7),会自动成为NSTaggedPointerString类型。

NSString* str = [NSStringt stringWithFormat:@"hello"];

这个字符串的类型就是NSTaggedPointerString

六 深浅拷贝

1.常见的字符串的深浅复制

浅复制:

对于浅复制而言,在内存中复制了两个对象,这两个对象的指针变量会指向同一个对象,也就是两个对象依然存在公用的部分。

深复制:

深复制不仅会复制对象本身,而且会递归复制每个指针类型的实例变量。直到两个对象没有任何共用的部分

关于深浅复制的内容可见此博客

2.容器类完全深拷贝

容器类调用copy或者mutableCopy能出现深拷贝的情况下,只是容器的深拷贝,不是容器内容的深拷贝。

那么容器类的完全深拷贝怎样实现呢?

NSDictionary Dict = [[NSDictionary alloc]initWithDictionry:someDictionary copyItems:YES];
NSArray* Array = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archiverDataWithRootObject:oldArray]];

http://chatgpt.dhexx.cn/article/BmrWC5KY.shtml

相关文章

函数的介绍

自话函数 函数这一概念&#xff0c;之前在数学中是最常见的。但不要忘记最初设计计算的前辈都是一些数学大家。所以函数这一概念自然也被引入到了计算机中。 数学中函数表示的一种映射关系(集合A到集合B之间的关系)&#xff0c;而到了计算机中这一概念被延伸。 计算机中函数由…

S函数介绍

S函数介绍 S函数中使用文本方式输入公式和方程&#xff0c;适合复杂动态系统的数学描述&#xff0c;并且在仿真过程中可以对仿真参数进行更精确的描述。 S函数模块是整个Simulink动态系统的核心。 S函数时系统函数&#xff08;system function&#xff09;的简称&#xff0c;是…

指示函数(indicator function)

1. 计数器 指示函数表示 其中有哪些元素属于某一子集的次数&#xff0c;及满足某一断言或条件的统计&#xff1b; 比如Hamming Loss&#xff1a; 其中 2. 二维的离散指示函数 ⇒ assignment solution xij∈{0,1…

指示函数 indicator function

指示函数 基本定义 指示函数&#xff08;indicator function&#xff09;   数学中&#xff0c;指示函数是定义在某集合X上的函数&#xff0c;表示其中有哪些元素属于某一子集A。   指示函数有时候也称为特征函数。现在已经少用这一称呼。概率论有另一意思迥异的特征函数。…

指示函数(indicator function)含义及word使用

含义 文献公式中经常能看到有个镂空的1的符号&#xff0c;表示指示函数 当符号后的式子为True&#xff0c;则函数值为1&#xff0c;否则为0 word中如何输入&#xff1f; 插入符号&#xff1a;字体选择“Cambria”&#xff0c;将符号列表下拉至最后&#xff0c;即可看到所有镂…

指示函数与符号函数

1、指示函数 数学中&#xff0c;指示函数是定义在某集合X上的函数&#xff0c;表示其中有哪些元素属于某一子集A。   指示函数有时候也称为特征函数。现在已经少用这一称呼。概率论有另一意思迥异的特征函数。 可以说为真输出1&#xff0c;为假输出0. 2、符号函数 数学上的…

函数的详细说明

作者简介&#xff1a;大一在校软件工程学生&#xff0c;正在奔赴成为大佬的路上&#xff0c;目前不定时更新C语言的相关知识体系和游戏制作 隶属专栏&#xff1a;C语言的大致理解 个人主页&#xff1a;励志做大佬的主页 目录 函数 函数的引入 函数的定义 函数的返回值 有…

指示函数

指示函数或示性函数&#xff08;indicator function&#xff09;数学中&#xff0c;指示函数是定义在某集合X上的函数&#xff0c;表示其中有哪些元素属于某一子集A。 即若x为真&#xff0c;则取值为1&#xff0c;否则取值为0.

TwinCAT3入门教程1——TC3系统安装

1、软件安装包和下载来源 1.1、V S2013&#xff0c;镜像文件&#xff1a;http://download.microsoft.com/download/B/1/9/B1932B8C-1046-4773-A1DD-4AB5C0978637/vs2013.2_ult_chs.iso 1.2 TC3安包和帮助 最新的安装包&#xff1a;Beckhoff | New Automation Technology | Bec…

TwinCAT3串口通讯EL6021模块使用-和串口调试助手自由协议通讯

目录 一、简介 二、环境介绍 三、接线连接 四、创建TwinCAT3程序工程 1、IO扫描和参数设置 2、字符串型数据发送和接收PLC程序创建 &#xff08;1&#xff09;库文件添加 &#xff08;2&#xff09;创建任务和程序 &#xff08;3&#xff09;变量关联 &#xff08;4&#…

TwinCAT3之Ads通讯——1、控制器和控制器间通讯

目录 1 简介 2 硬件连接 3、工程和配置 3.1 Ads Mast主工程 3.2 创建从机工程 4 Ads主机中读写操作测试 4.1 Mast读操作 4.2 Mast写操作 1 简介 ADS通讯是倍福公司定义的一种专门协议&#xff0c;用于TwinCATsheb 之间非周期性通讯。既可以用控制器内部通讯、控制器跟控…

【Twincat3】devices的scan不可选中,twincat服务未开启

1.问题现象: 2.问题原因&#xff1a; 从站未开启&#xff0c;即这个图标是灰色状态 3.解决方法&#xff1a; 1&#xff09;winR&#xff0c;输入msconfig命令&#xff1a; 2&#xff09;勾选twincat服务&#xff0c;点击应用确定即可 3&#xff09;点击后&#xff0c;会有…

TwinCAT3 学习笔记一之界面介绍

TwinCAT3图标介绍 安装好TwinCAT3后可以在任务栏右下角看见这个图标 About TwinCAT 右击第一行的About TwinCAT 可以看见TwinCAT3版本 也可以找到本机的AMS Net Id Tool工具栏 Event Viewer 可以记录软件的运行和错误的历史。 TwinCAT Project Compare 可以进行项目工程…

Twincat3 的基础操作

一、倍福Twincat3的安装操作 安装地址:www.beckhoff.com.cn 安装步骤: 安装后点击下一步即可安装成功。 注意事项: 二、 Twincat3目录介绍 三层架构 PLC轴、NC轴和物理轴 PLC程序为PLC轴 NC配置界面定义的AXIS叫NC轴 IO配置扫描的硬件叫物理轴 PLC程序对电机进行控制需经过两…

TwinCAT3导入TwinCAT2项目pro文件的方法

TwinCAT3导入TwinCAT2项目pro文件的方法 1、在倍福虚拟学院的网站上&#xff0c;经常可以下载到基于TwinCAT2编写的例程&#xff0c;要在TwinCAT3的编程环境中打开这些例程&#xff0c;可以遵循以下的方法&#xff1a; 背景知识介绍&#xff1a; 例如下载了EL6021的自由串口例…

【EtherCAT实践篇】四、TwinCAT 3实验1-基本操作

这里EtherCAT主站采用PC 的TwinCAT 3&#xff0c;【EtherCAT实践篇】一、TwinCAT3安装已经介绍了TwinCAT 3的安装方法。在利用TwinCAT 3进行实验前&#xff0c; 先学习下TwinCAT 3的基本操作。 1、TwinCAT3新建工程 新建项目&#xff1a; 填好新建工程路径和名称&#xff1a;…

TwinCAT3 Error starting TwinCAT system! 报错问题

TwinCAT3 Error starting TwinCAT system! 报错问题 Win10系统下 TwinCAT3 首次使用运行项目时会出现如图报错&#xff1a; TwinCAT System (10000): Sending ams command >> lnit4\RTime: Start Interrupt: Ticker started >> AdsError: 4115 (0x1013, RTIME: s…

win10系统下TwinCAT3与VS2019之间的ADS通信

WIN10, TwinCAT3, VS2019, ADS 转博后第一次出差&#xff0c;来到了UnitedImaging&#xff0c;这次的任务是负责在ros系统和TwinCAT3之间的 ADS 通信。 作为本次第一篇博客&#xff0c;先跑通win10系统下TwinCAT3与VS2019之间的ads通信。 本文在PLC中设置一个BOOL量&#xff0c…

TwinCAT概述

1.什么是TwinCAT&#xff1f; TwinCAT是Beckhoff公司的运动控制软件&#xff0c;全称是"The Windows Control and Automation Technology"&#xff0c;基于Windows操作系统。 2.TwinCAT的结构 TwinCAT包含三层结构&#xff1a;PLC轴、NC轴和物理轴。 PLC程序中定…

如何基于TwinCAT3实现伺服电机控制(一)

先说一下硬件&#xff0c;伺服电机采用定制的关节无框力矩电机&#xff0c;带力矩传感器&#xff0c;EtherCAT通讯&#xff0c;想用在康复机器人上做运动控制研究。 软件方面采用TwinCAT3&#xff0c;这个到倍福官网https://www.beckhoff.com.cn/zh-cn/上搜索下载即可&#xf…