OC学习 第八节 NSData NSSet

2024-02-26 08:08
文章标签 学习 oc 第八节 nsset nsdata

本文主要是介绍OC学习 第八节 NSData NSSet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

===================
day8 Foundation杂类
===================

# 回顾
C模拟内存的引用计数
—————————————————————
# 模拟自定义autoreleasepool
—————————————————————
# 基本数据类型怎么存放到OC数组中?
NSNumber initWithLong:… initWithInt…
longValue intValue
numberWithDouble:…
doubleVaule
比较两个数字对象的内容:[num1 isEqualToNumber:num2]
@123
—————————————————————

# NSValue
包装 int long …
// int --> NSValue
int age;
NSValue *intValue = [NSValue valueWithBytes:&age objCType:@encode(int)];

// NSValue --> int
int newAge;
[intValue getValue:&newAge];
NSLog(@"%d", newAge);

// double --> NSValue
double score = 3.14;
NSValue *scoreValue = [NSValue valueWithBytes:&score objCType:@encode(double)];

// NSValue --> double
double newScore;
[scoreValue getValue:&newScore];
NSLog(@"%lf", newScore);

// 判断数据类型
NSLog(@"%s", scoreValue.objCType);
NSLog(@"%s", @encode(double));
// 判断数据类型
if (strcmp(scoreValue.objCType, @encode(double)) == 0) {
    NSLog(@"double类型");
}

// 官方已经封装好了一些函数 专门转化 NSRange NSSize NSRect
NSRange ran = {100,3};
NSValue *ranValue = [NSValue valueWithRange:ran];
NSRange newRan = [ranValue rangeValue];

# 如何把一个字符串的字串范围NSRange保存在OC数组? NSRange -> struct
NSValue :可以把任意的数据类型转化为 NSValue对象
那么C语言的数组类型 和结构体类型 等这些复合的数据类型 都可以通过NSValue 进行转换
示例:
typedef  struct _Range {
    NSInteger location;
    NSInteger length;
}MyRange;

MyRange range1 = {1,3};
如何把这样一个结构体放进数组呢?
转成NSValue对象:
// MyRange —> NSValue
/*
         - (id)initWithBytes:(const void *)value objCType:(const char *)type;
         功能:创建NSValue对象
         第一个参数:传要转化的数据类型空间的地址
         第二个参数:类型字符串  需要用@encode(类型名)
         */
NSValue *value = [[NSValue alloc] initWithBytes:&range1 objCType:@encode(MyRange)];
// [NSValue valueWithBytes:(const void *) objCType:(const char *)];

// NSValue --> MyRange
MyRange newRange;
[value getValue:&newRange];
NSLog(@"loc: %ld len: %ld", newRange.location, newRange.length);

—————————————————————

NSNull 如何往数组中插入一个空对象

—————————————————————

NSSet/NSMutableSet
// 集合类的元素 可以是任意类型的对象地址
NSSet *set1 = [[NSSet alloc] initWithObjects:@"one",@1,@"oc",@"ios",@"ui", nil];
NSLog(@"set1:%@",set1);

// 通过类方法 实例化一个NSSet对象
NSSet *set2 = [NSSet setWithObjects:@"oc",@"ios",@"ui", nil];
NSLog(@"set2:%@",set2);

NSLog(@"count:%ld",set1.count); //集合元素的个数
[set1 release];

// 在存放集合元素的时候是没有相同的元素,如果出现相同的那么只会存一个
NSSet *set3 = [NSSet setWithObjects:@"ui",@"oc",@"ios",@"ios", nil];

NSLog(@"set3:%@",set3);
if ([set3 isEqualToSet:set2]) {
    NSLog(@"集合内容相同");
}

// 判断是否是子集合
NSSet *set4 = [NSSet setWithObjects:@"oc",@"ui", nil];

if ([set4 isSubsetOfSet:set3]) {
    NSLog(@"set4指向的集合是set3指向的集合的子集合");
}

// 根据一个数组创建一个新的集合
NSArray *arr = @[@"one",@"two",@"three",@"four"];
NSSet *set5 = [NSSet setWithArray:arr];
NSLog(@"set5:%@",set5);

// 把一个集合转化为一个数组
NSArray *newArr = [set4 allObjects];
NSLog(@"newArr:%@",newArr);

// 可变集合
NSMutableSet * mutSet = [NSMutableSet setWithObjects:@"one", nil];

// 增加元素
[mutSet addObject:@"oc"];
NSLog(@"mut:%@",mutSet);

// 删除指定的元素
[mutSet removeObject:@"one"];
NSLog(@"mut:%@",mutSet);

[mutSet addObject:@"ui"];
[mutSet addObject:@"ios"];

NSSet *set6 = [NSSet setWithObjects:@"java",@"c#", nil];
NSSet *set7 = [NSSet setWithObjects:@"oc", nil];
NSLog(@"mut:%@",mutSet);
// 把一个集合增加到另外一个集合中
// [mutSet unionSet:set6];
// 删除一个集合中得元素
[mutSet minusSet:set7];
NSLog(@"mut:%@",mutSet);

// 遍历集合
for (NSString *str in mutSet) {
    NSLog(@"str:%@",str);
}

NSArray *arr3 = @[@"one",@"two",@"three",@"four",@"five",@"six"];

//数字集合 /索引集合
NSIndexSet *indexs = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1, 3)];
//把 一个范围内的数字转化为一个数字集合对象 集合元素是1 ,2 ,3
//把数组arr3的 索引值 1 2 3的元素提取出来构成一个新的子数组
NSArray *subArr = [arr3 objectsAtIndexes:indexs];
NSLog(@"sub:%@",subArr);

//提取 数组arr3中得 索引值分别是0 2 4对应得元素
//1.创建1个空得可变索引集合
NSMutableIndexSet *mutIndexs = [NSMutableIndexSet indexSet];
//增加数字索引
[mutIndexs addIndex:0];
[mutIndexs addIndex:2];
[mutIndexs addIndex:4];

NSArray *subArr2  = [arr3 objectsAtIndexes:mutIndexs];
NSLog(@"sub2:%@",subArr2);

—————————————————————

NSDate  时间类
//获取当前系统时间
//NSDate *date = [[NSDate alloc] init];
NSDate *date = [NSDate date];
//GMT 格林威治时间
NSLog(@"date:%@",date);

//创建一个距离当前系统时间 10s之后的一个时间
NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:10];
NSLog(@"date2:%@",date2);

//1970 01-01 00:00:00 计算机元年
//距离计算机元年 30s之后 的一个时间
毫秒 1000*60*60*24*365*100
NSDate *date3 = [NSDate dateWithTimeIntervalSince1970:30];
NSLog(@"date3:%@",date3);

NSDate *nowDate = [NSDate date];
NSLog(@"now:%@",nowDate);
//计算时间差 NSTimeInterval  秒-》单位
NSTimeInterval subT = [nowDate timeIntervalSinceDate:date];
NSLog(@"sub:%f",subT);//执行创建date 和nowDate 代码的时间差

//计算nowDate 距离 计算机元年的一个时间差
NSTimeInterval subT2 = [nowDate timeIntervalSince1970];
NSLog(@"sub2:%f",subT2);

//距离nowDate  1小时之后的一个时间
NSDate *newDate = [nowDate dateByAddingTimeInterval:60*60];
NSLog(@"newDate:%@",newDate);
//nowDate 一天之后的时间
NSDate *newDate2 = [nowDate dateByAddingTimeInterval:24*60*60];
NSLog(@"newDate2:%@",newDate2);

//获取两个时间中较早的一个时间
NSDate *d2 = [nowDate earlierDate:newDate];
NSLog(@"d2:%@",d2);
//获取两个时间中较晚的一个时间
NSDate *d3 =  [nowDate laterDate:newDate];
//比较两个时间是否相等
BOOL ret = [nowDate isEqualToDate:newDate];

//获取遥远的过去的一个时间
NSDate *past = [NSDate distantPast];
NSLog(@"past:%@",past);
//获取遥远的将来的一个时间
NSDate *future = [NSDate distantFuture];
NSLog(@"future:%@",future);

—————————————————————

NSTimeZone
NSDate *date = [NSDate date];
NSLog(@"%@", date);

//获取当前系统的时区
NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
//算出当前系统时区和格林威治时区的时间差
NSTimeInterval sub = [timeZone secondsFromGMTForDate:date];

//推算出本地真正时间
NSDate *localTimer = [date dateByAddingTimeInterval:sub];
NSLog(@"loc:%@",localTimer);

—————————————————————
NSDateFormatter
NSDate *date = [NSDate date];
//时间格式化 对象
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//设置时间格式化
/*
 yyyy 设置年 4位
 MM   月
 dd   天
 
 hh 12进制小时
 mm  分钟
 ss  秒
 
 HH 24进制
 
 EEEE 星期几
 */
dateFormatter.dateFormat = @"yyyy年MM月dd日 HH:mm:ss EEEE";

//把NSDate 的时间对象 转化为时间字符串(会转化为真正的本地时间)
//把date时间对象按照dateFormatter的时间格式 进行转换
NSString *dateString = [dateFormatter stringFromDate:date];
//dateString已经按照本地时区转换了
NSLog(@"dateStr:%@",dateString);

[dateFormatter release];


NSDateFormatter *f2 = [[NSDateFormatter alloc] init];

f2.dateFormat = @"yyyy年MM月dd日 HH:mm:ss";

NSString *t = @"2014年11月28日 13:01:01";//必须要和时间格式一致
//把一个时间字符串按照 时间格式进行转化 转换为NSDate 类型
NSDate *newDate = [f2 dateFromString:t];
NSLog(@"newdate:%@",newDate);
[f2 release];
—————————————————————
—————————————————————

官方的类可以进行拷贝
//NSString  NSMutableString  NSArray NSMutableArray
NSDictionary NSMutableDictionary  NSSet NSMutableSet
NSData NSMutableData
对于上述系统的类 copy 是意思:把一个对象拷贝成不可变对象
上述系统的类mutableCopy  的意思:把一个对象拷贝成可变对象


# 单例
+ (MyPlane *)defaultPlane {
    static MyPlane * plane = nil;
    //如果有多个线程进行操作那么这些线程会排队一个一个进行
    @synchronized(self) {//同步  考虑线程安全
        if (plane ==  nil) {
            plane = [[self alloc] init];
        }
    }
    
    return plane;
}

这篇关于OC学习 第八节 NSData NSSet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748185

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件