黑马程序员—OC语言基础—Foundation框架小结

本文详细介绍了iOS开发中常用的多种框架,包括UIKit、Foundation、CoreData等,并深入探讨了它们的功能和应用场景。此外还讲解了Objective-C中NSString、NSArray等基础类的使用方法。

————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———————

一、Cocoa框架的大致了解

苹果为我们提供了丰富和完善的框架体系,我们只要合理使用这些框架就能完成绝大部分的工作,极大的提高了我们的编程效率。下面我们简要了解一下这些框架和使用场合。

1Cocoa框架

Cocoa框架是苹果创建的专门用于MacOSIOS的原生API,由NeXtSTEP演变而来,严格遵守MVC模型,他是一个庞大的框架集合,我们本节所要了解的各种框架,都是Cocoa框架的一个个部分,Cocoa框架可以自适应MAC OSIOS两大平台,

2Foundation框架

在前面的学习中,我们主要用到的就是Foundation框架,Foundation框架规范了基本的OC结构类型、表达式、消息传递等机制,设置了NSObject基类及服务,并在此基础上,创建了大量基础的对象类。

3UIKit框架

UIKitIOS中用于构建用户界面及用户交互的基本框架,可以说,一个IOS应用程序离不开UIKit框架,该框架包含了UIViewUIButtonUITextfieldUIResponder等基本的用户交互类,以及UIColorUIImageUINib等相关类,我们可以直接调用UIkit中为我们提供的丰富交互类库,同时可以在此基础上定制自己的UI对象,实现丰富的用户界面。

4Core Data框架

该框架采用SQLlite技术创建和管理对象,优化内存存储,同时支持基于文档的应用程序,包括NSAtomicNSFetchRequestNSManagedObjectNSSaveChangesRequest等类。我们如果要实现undo/redo、优化存储、管理表视图结果以及创建基于文档的应用程序时,需要用到Core Data中的功能。

5Core Graphics框架

该框架为底层绘图函数库,可以实现UIKit无法实现的复杂图形的绘制(如曲线的绘制),我们可以用他来创建基于路径的绘图,进行图形的抗锯齿渲染以及图片、PDF、梯度、颜色等信息的底层处理,

6Quartz Core框架

我们采用UIKit框架创建一个窗体,一个按钮,或者播放一个视频,其实归根结底,还是要用到Quarzt Core框架,这个框架为我们提供屏幕显示最基本的层、帧、运动和变形等实现,如果我们要实现一些UIKit没给我们提供的功能或者特效,就要用到Quarzt Core框架里的类或者功能。

7OpenGL ES框架

该框架支持2D3D绘图及渲染,是一个完整的游戏引擎,他直接访问底层设备,提供高速、复杂的视觉体验,能够创建2D3D图形,实现复杂的图形分析和变化,一般用来制作视觉冲击较大的大型游戏及娱乐项目,也可以用来分析和研究图形。

这些框架在开发过程中可能都会涉及到,我们在此是基础的学习,更偏向于将Foundation框架的服务搞懂了。以后学到其他框架的使用,我会再总结。


二、Foundation框架

1. Foundation框架的主头文件名称就是Foundation.h

2. Foundation框架包含了很多数据类型(结构体,枚举)和类

3.Foundation框架中的结构体(NSRangeNSPointCGPoint),NSSizeCGSize),NSRectCGRect))

1)NSRange(表示范围)(包含两个成员:locationlength

1@"I love oc"; love范围可表示为(location=2 length=4

[10,19,20,21,22]最后三个数(20,21,22)的范围是(location=2length=3

2:表示@"I love oc"; love的范围

NSRange r = NSMakeRange(2,4);

3:查看@"I love oc"; love的范围

NSString * str = @"I love oc";
NSRange range = [str rangeOfString:@"love"];
NSLog(@"location=%d,length=%d",range.location,range.length);

2. NSPointCGPoint(表示点坐标(xy))

创建方式:

CGPoint  P1=NSMakePoint(10,10)
NSPoint  P2=CGPointMake(10,10)

3. NSSizeCGSize)(表示尺寸)(宽度(width)高度(height))

创建方式:

CGSize  S1=CGSizeMake(100,20)
NSSize S2=CGMakeSize(20,10)

4. NSRectCGRect

CGRect r1=CGRectMake(0,0,100,50)//CGRect包含了CGPoint(0,0)和CGSize (100,50)

5. 将结构体转换为字符串:

CGPoint  P1=NSMakePoint(10,10);
NSString*str=  NSStringFromPoint(P1);      //将P1这个结构体转成字符串
NSLog(@"%@",str);  // 输出结果为{10,10}

6.结构体的其它用法

1)坐标原点的表示方法

1CGPointMake00

2CGPoint Zero

2)判断两个点是否相同(BOOL类型)

CGPoint EqualToPoint((CGPoint  point1),(CGPoint point2))//可以将  CGPoint换成CGSize或者 CGRect
3)判断一个点是否在一个范围内

CGRectContainsPoint((CGRect rect),(CGPoint  point))

使用这些函数的前提是CoreGraphics框架


三、NSString(不可变)

1. 字符串(NSString)的创建方式

1NSString * s1=@"4234";

2NSString * s2=[[NSString alloc] initwithstring :@"jack"];(不常用)

3NSString * s3=[[NSString alloc] initwithFormat :@"age is %d"10] ;

4NSUTF8StringEncoding用到中文就可以用这种编码

NSString*s5=[[NSString alloc] initwithContentsOfFile@"/Users/apple/Desktop/1.txt"encoding:NSUTF8StringEncoding         error:nil];              //桌面文件路径

//URL:资源路径(协议头://路径)

网络资源   http://

本地资源   file://

服务器资源: ftp://

NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];

NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];

5NSString *s6 = [[NSString alloc] initWithContentsOfURL:urlencoding:NSUTF8StringEncoding error:nil];

6NSString *s7 = [s2 stringByAppendingString:@" 1112"];

一般都会有一个类方法跟对象方法配对

[NSURL URLWithString:<#(NSString *)#>];

[NSString stringWithFormat:@""];

[NSString stringWithContentsOfFile:<#(NSString *)#>encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing*)#>];

2. C语言字符串与OC字符串的转换

1C语言字符串转为OC字符串NSString *s7 = [[NSString alloc]initWithUTF8String:"jack"];

2OC字符串转为 C语言字符串:constchar *cs = [s4 UTF8String];

3. 将一个字符创写到文件中

[@"Jack\nJack"writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

//"jack"这个字符串写进/Users/apple/Desktop/my.txt这个文件中去(一般写Yes,安全性高)

也可以调用类方法实现:

[str writeToURL:url atomically:YESencoding:NSUTF8StringEncoding error:nil];

4. 输出: NSLog@”我在%@上课”,str;

5. 获取当前字符串的长度:[str length];//字符串length方法返回的是字符串的字数(空格算一个字)


四、NSMutableStringNSString的子类)(可变的)

1. NSString所有的创建方式,NSMutableString都拥有

2. NSMutableString是可变的,可以往里面增加或删除内容

3. 拼接

NSMutableString *s1 = [NSMutableStringstringWithFormat:@"my age is 10"];
[s1 appendString:@" 11 12"];        // 拼接内容到s1的后面

4. 删除

NSMutableString *s1 = [NSMutableStringstringWithFormat:@"my age is 10"];
[s1 deletecharactersInRange:NSMakeRange(4,2)];      //删除s1中某个位置范围的字符

5. 如果要删除某个固定的字符

1)首先获取is的范围

NSRange range = [s1 rangeOfString:@"is"];

2)再进行删除

[s1 deleteCharactersInRange:range];

补充:NSString也有appendstring方法,但是它不会改变原来的字符串,只是返回了一个新的拼接好的字符串


五、NSArray(不可变数组)(有序的)

1. Foundation框架下有很多类:NSStringNSArrayNSSetNSDictionaryNSDateNSObject

2. NSArray是一个集合类(只能存放OC对象,不能存放非OC对象(基本数据类型:intstructenum))

3. 创建方式:

1NSArray*array=[NSArraywithobjects:@"jack",@"rose",nil];   //nil是数组元素结束的标志

2)快速创建:NSArray*array=@[@"jack",@"rose"]        //一般选用这种创建方式

4. OC数组不能存放空值(nil

5. 数组元素的个数:

[array count];

NSLog@"%ld",array.count

6. 拿出数组中的某个元素

1[array  objectAtIdex:1];         //拿出数组的第一个元素

2array[0];                      (一般选用这种方式)

7. NSArray的遍历

1

for(int i=0;i<array.count;i++)
{
    NSLog(@ "@%",array[i]);
}

2)快速遍历

for (id obj in array) // id  obj代表数组中的每一个元素,把array中的每个元素拿出来,赋值给obj
{
    // 找出obj元素在数组中的位置
    NSUInteger i=[arrayindexOfObject :obj];
    NSLog(@"%@-%@",i,obj);
}

3)利用block

[array enumerateObjectsUsingBlock:
 // 每遍历到一个元素,就会调用一次block
 // 并且当前元素和索引位置当做参数传给block
 ^(id obj, NSUInteger idx, BOOL *stop)      //stop为停止遍历
 {
     NSLog(@"%ld - %@", idx, obj);
     if (idx == 0)
     {
         // 停止遍历
         *stop = YES;
     }
     
 }];


六、NSMutableArrayNSArray的子类)(可变数组)(无序的)

1. 添加元素

NSMutableArray*array=[NSMutableArray array];
[array addobject:[[person alloc]init]];
[array addobject:@"jack"];

2. 删除元素

[array removeAllobjects];   //删除所有元素
[array removeobject:@"jack"];//删除指定元素"jack"
[array removeobjectAtIndex:2];//删除第二个元素

错误写法

1[array addobject:10];   //OC数组不能存放基本数据类型

2[array addobject:nil];   //不能为空

3NSMutableArray*array=@[@"jack",@"rose"];//@[]只可以创建不可变数组NSArray


七、NSDictionary

顾名思义,这是一个字典类,如字典一样,知道一个字母便可找到对应的许多内容,那么NSDictionary里面放的就是类似字典的键值。key是索引,value是对应的值。字典的无序的,字典不允许有相同的key,但允许有相同的valueObject

1.创建一个字典

1)

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];

2)

NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

3

NSDictionary *dict = <span style="font-family: Arial, Helvetica, sans-serif;">[NSDictionary dictionaryWithObjectsAndKeys:@"jack", @"name",@"北京", @"address",@"32423434", @"qq", nil ];</span>

4)快速创建

NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};

2.根据键找到值

id obj = [dict objectForKey:@"name"]== id obj = dict[@"name"];
NSLog(@"%@", obj);

3.返回的是键值对的个数

NSLog(@"%ld", dict.count);

4.遍历字典

1)

NSArray *keys = [dict allKeys];
for (int i = 0; i<dict.count; i++)
{
    NSString *key = keys[i];
    NSString *object = dict[key];
    NSLog(@"%@ = %@", key, object);
}

2)

[dict enumerateKeysAndObjectsUsingBlock:
 ^(id key, id obj, BOOL *stop) {
     NSLog(@"%@ - %@", key, obj);
     
     // *stop = YES;
 }];
}

5.NSMutableDictionary

1)创建可变的字典

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

2)添加键值对

[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];

3)移除键值对

[dict removeObjectForKey:<#(id)#>];
NSLog(@"%@", dict);

6.数组与字典的混合使用

NSArray *persons = @[
                     @{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]},
                     @{@"name" : @"rose", @"qq" : @"767567"},
                     @{@"name" : @"jim", @"qq" : @"423423"},
                     @{@"name" : @"jake", @"qq" : @"123123213"}
                     ];   //数组里有字典,字典里面有词典

NSDictionary *jim = persons[2]; NSLog(@"%@", jim);表示jim所在的那个字典

NSString *bookName = persons[0][@"books"][1];      NSLog(@"%@", bookName); 先取数组0位置对应的字典,再取出自带里book数组的第2本书

NSArray *array = persons[0][@"books"];      NSLog(@"%@", array);  将书全部放在arry数组里面

NSLog(@"%@", persons[1][@"qq"]);    先取出1位置对应的字典,再取出字典中qq这个key对应的数据

集合的总结:

集合

1)NSArray\NSMutableArray

* 有序

* 快速创建(不可变):@[obj1, obj2, obj3]

* 快速访问元素:数组名[i]

2)NSSet\NSMutableSet

* 无序

3)NSDictionary\NSMutableDictionary

* 无序

* 快速创建(不可变):@{key1 : value1,  key2 : value2}

* 快速访问元素:字典名[key]


八、NSNumber

OC中的NSNumber就是一般数据类型的类,它可以将一般数剧类型包装成对象。

1.将基本数据类型转为NSNumber

NSNumber *num = [NSNumber numberWithInt:10];
int=[num intValue];

NSNumber *n = [NSNumber numberWithDouble:10.5];
int d = [n doubleValue];

2.数据转为NSString

int a=20;
NSString *str = [NSString stringWithFormat:@"%d", a];   这将20转为@"20" 即数据转为string

NSLog(@"%d", [str intValue]);

3.快速转为NSNumber

将各种基本数据类型包装成NSNumber对象

@10.5;

@YES;

@'A';      注意:@"A"; 它是 NSString对象

age变量包装成NSNumber对象

int age = 100;

@(age);或者[NSNumber numberWithInt:age];

九、NSDate

OC中将日期也封装成一个NSDate类,是它是一个日期时间类.

1.创建一个时间对象

NSDate *date = [NSDate date];

打印出的时候是0时区的时间(北京-8区)

NSLog(@"%@", date);

NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date]; //表示从运行到此行代码时间5秒钟后的时间

2. 1970开始走过的秒数

NSTimeInterval seconds = [date2 timeIntervalSince1970];

3 .日期的格式

可以改变日期的格式

NSDate *date = [NSDate date]
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// y 年  M 月  d 日
// m 分 s 秒  H (24)时  h(12)时
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@", str);

4.将字符转成日期

NSString *time = @"2011/09/10 18:56";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd HH:mm";
NSDate *date = [formatter dateFromString:time];
NSLog(@"%@", date);

十、NSValue

NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue

1.结构体转为NSValue对象

CGPoint p = CGPointMake(10, 10);

将结构体转为Value对象

NSValue *value = [NSValue valueWithPoint:p];

2.将value转为对应的结构体

[value pointValue];
NSArray *array = @[value ];

代码下载地址: https://pan.quark.cn/s/a4b39357ea24 在计算机视觉技术中,数据集扮演着训练和评估模型的核心角色。Labelme作为一个广受欢迎的开源工具,能够支持用户以交互方式对图像进行标注,而COCO(Common Objects in Context)则是一种被广泛采纳的数据集标准格式,适用于包括物体检测、图像分割在内的多种任务。本文将详细阐述如何将Labelme生成的标注数据转换为COCO数据集的标准格式。 Labelme标注的图像在输出为JSON格式时,会包含以下核心内容: 1. `version`: 指明JSON文件的版本信息。 2. `flags`: 目前未定义或保持为空,预留用于未来的功能扩展。 3. `shapes`: 列表形式存储对象的形状信息,每个形状项包含`label`(对象类别名称),`points`(构成对象边缘的多边形顶点),以及`shape_type`(通常为“polygon”)。 4. `imagePath`和`imageData`: 提供原始图像的存储路径和二进制数据,便于后续图像的还原。 5. `imageHeight`和`imageWidth`: 明确标注图像的垂直和水平尺寸。 COCO数据集的标准格式中定义了三种主要的标注类型: 1. Object instances(目标实例):主要用于执行物体检测任务。 2. Object keypoints(目标上的关键点):适用于人体姿态估计相关应用。 3. Image captions(看图说话):用于生成图像的文本描述。 COCO的JSON结构中包含以下基本组成部分: 1. `images`:记录图像的基本属性,包括`height`(高度)、`...
内容概要:本文围绕基于Basisformer模型的时间序列锂离子电池SOC(State of Charge,荷电状态)预测展开研究,利用PyTorch深度学习框架构建并训练模型,旨在提升锂电池SOC估计的准确性与鲁棒性。该方法融合Transformer架构的核心机制,通过引入基函数(Basis)分解策略,有效捕捉电池充放电过程中长时序、非线性动态特征,增强模型对复杂工况的适应能力。研究不仅详细阐述了Basisformer的网络结构设计、注意力机制优化与训练流程,还提供了完整的Python代码实现方案,涵盖数据预处理、模型搭建、损失函数定义、训练验证及结果可视化等环节,便于科研人员快速复现、调优并拓展至其他电池状态预测任务。; 适合人群:具备一定深度学习与Python编程基础,熟悉PyTorch框架,从事电池管理系统(BMS)、新能源汽车、储能系统、智能传感等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于动力电池与储能系统的实时SOC估算模块,提升系统安全性与能量利用效率;②作为学术研究的基础模型,用于复现、改进基于Transformer的时间序列预测方法在电化学系统中的应用;③为数据驱动的电池健康状态(SOH)、剩余使用寿命(RUL)联合估计提供可扩展的技术框架。; 阅读建议:建议读者结合所提供的代码与公开电池数据集(如NASA、CALCE等)进行动手实践,深入理解模型的输入输出结构与时序建模逻辑,同时可尝试引入温度、老化周期等多维特征,或融合物理模型构建混合预测架构,以进一步提升预测精度与泛化能力。
内容概要:本文系统阐述了基于动态规划算法优化插电式混合动力电动汽车(PHEV)能源管理的技术方案,结合Matlab与Simulink工具实现完整的仿真建模与代码开发。通过动态规划这一全局优化方法,在已知驾驶循环条件下,精确求解发动机、电机及电池之间的最优能量分配策略,以实现燃油消耗与排放的最小化目标,解决PHEV多能源路径规划中的复杂决策问题。文中提供了详尽的仿真模型构建流程与算法实现步骤,涵盖车辆动力学建模、能量管理架构设计、状态空间定义、代价函数构造、最优控制律求解及结果可视化分析等关键环节,全面揭示PHEV能量管理系统的内在机制与优化逻辑。; 适合人群:具备一定Matlab/Simulink编程基础,从事新能源汽车、智能控制、电力电子、自动化或交通运输工程等相关领域的研究生、科研人员及工程技术人员,尤其适合专注于车辆能量管理策略、节能控制算法研究的专业人士。; 使用场景及目标:①深入掌握动态规划在混合动力汽车能量管理中的理论基础与工程实现方法;②学习如何在Matlab/Simulink环境中搭建PHEV整车仿真平台并实施多目标优化仿真;③为学术研究、学位论文撰写或实际工程项目提供可复用的算法框架、模型模板与技术支持,支撑后续对等效燃油消耗最小化策略(ECMS)、模型预测控制(MPC)、实时优化算法等的对比研究与性能评估。; 阅读建议:建议读者结合所提供的完整代码与Simulink模型文件,逐模块调试运行,重点理解状态变量离散化处理、前后向递推求解过程、惩罚项设置以及边界条件处理等核心技术细节,同时可进一步拓展应用于不同工况场景、不同车型结构或与其他优化算法(如庞特里亚金极小值原理PMP)的对比验证,从而深化对PHEV能量管理实时性与全局性平衡问题的理解。
内容概要:本文围绕基于多虚拟同步发电机(VSG)的独立微网系统,开展多目标二次控制策略的MATLAB/Simulink建模与仿真研究。通过构建包含多个VSG单元的独立微网系统,设计并实现了能够同时实现频率与电压的无静差恢复、有功/无功功率精确分配以及环流有效抑制的综合控制目标的二次控制方法。研究重点在于控制策略的整体架构设计、关键控制模块的数学建模及其在Simulink环境中的精细化实现,通过大量仿真实验验证了所提控制策略在不同工况下的有效性、动态响应性能及系统鲁棒性。; 适合人群:具备电力系统分析、自动控制理论及现代电力电子技术等专业知识背景,熟悉MATLAB/Simulink仿真工具,从事新能源发电、微电网运行与控制、分布式能源系统集成等相关领域的科研人员、工程技术人员及高校研究生。; 使用场景及目标:① 深入掌握多VSG独立微网系统的建模方法与稳定性分析要点;② 理解并复现兼顾静态精度与动态品质的多目标二次协同控制算法;③ 为新型微网控制保护装置的研发及先进控制策略的工程化应用提供可靠的仿真验证平台和技术储备。; 阅读建议:学习者应在巩固电力系统基础理论的前提下,重点关注控制算法的设计逻辑、各控制环节间的耦合关系以及Simulink模块的搭建技巧,建议通过调整系统参数、设置不同的负载投切与故障扰动工况进行反复仿真,以深刻理解控制策略的内在机理与适应能力。
【通用视觉框架】基于Qt+Halcon开发的仿Visionmaster的通用视觉框架软件,全套源码,开箱即用 1.1 背景 ​ 本项目软件开发意图为实现对Halcon、Opencv算子及其它视觉软件的便捷使用,由于Halcon和Opencv使用相比VisionPro较为麻烦,故此本软件仿照海康VisionMaster的流程图式操作,实现对Halcon、Opencv及其它视觉软件的二次开发。 2.1 软件概述 本软件使用Qt框架进行开发,实现对视觉流程的自由搭配,市场上对标海康威视的VisionMaster; 本软件使用插件化开发框架,可使用提供的二次开发库自行添加新功能算子和新模块(将生成的插件放置到对应目录下即可); 2.2 功能概述: 视觉流程图式编程:实现对视觉/数据处理算子的自由编程,从而实现各类复杂的视觉需求 项目读取保存:将编程的视觉项目进行保存或者读取 图像显示:主界面中可以显示及监控视觉算子的图像处理情况 日志消息显示:显示软件运行过程中出现的日志消息 多语言:可进行多种语言切换 2.3 开发平台 主开发语言:Qt(C++) C++语言标椎:C++17 开发环境:Window/Linux 编程平台:Qt Creator 编译器: |版本 | MSVC | Qt 6.4.0 MSVC2019 64bit | | Mingw | Qt 6.4.0 MinGW 64-bit | 视觉工具:Halcon19.11 Progress X64 资源介绍请查阅:https://blog.csdn.net/m0_37302966/article/details/146980317 更多视觉框架资源:https://blog.csdn.net/m0_37302966/article/details/146583453
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值