技术标签: objective-c 再探Objective-C ios
• 本章是-Foundation框架里的其它常用类
• 【**】集合类【容器类】
• 字典【*】
• 【**】概念:字典是一个无序的集合,它使通过键值对的方式来存储数据的
• 【**】特点
• 一个 key(键) 对应 一个value(值)
• 做key的元素必须遵守NSCopying
• 我们一般使用NSString作为key
• 【*】NSDictionary
• 【**】概念:不可变字典,字典创建后里面的元素不可改变
• 【**】创建
• 通过简介构造方法[【少用】
• NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@1,@"a",@2,@"b",@3,@"c",nil];
• 通过初始化方法【少用】
• [[NSDictionary alloc]initWithObjects:values forKeys:keys];
• 快捷的创建方法[字面量]【常用】
• NSDictionary *dict = @{@"a":@1,@"b":@2,@"c":@3};
• 【**】获取字典的长度
• 字典中有多个键值对
• dict.count
• [dict count]
• 【**】获取某个key对应的元素
• [dictobjectForKey:@"a"];
• dict[@"a"];
• 【*】遍历
• 【*】先取出所有的key 或所有的值
• 然后通过遍历数组的方式来遍历
• [dict allKeys]
• [dict allValues]
• 【*】通过枚举器的方式
• NSEnumerator * enumer = [dict keyEnumerator];
• NSString *key;
• while (key = [enumer nextObject]) {
• NSLog(@"key = %@,value =%@",key,dict[key]);
• }
• 取出值的枚举器 [dict objectEnumerator];
• 【*】forin[常用]
• NSDictionary *dict =@{@"a":@1,@"b":@2,@"c":@3};
•
• for (NSString *key in dict) {
• NSLog(@"%@-%@",key,dict[key]);
• }
• 【*】block方式[比较常用]
• [dict enumerateKeysAndObjectsUsingBlock:^(idkey, id obj, BOOL *stop) {
•
• NSLog(@"key = %@,value =%@",key,obj);
•
• }];
• 字典与文件
• 写入文件
• [dictwriteToFile:@"/Users/lideshan/Desktop/test.plist" atomically:YES];
• 从文件中读取
• [NSDictionarydictionaryWithContentsOfFile:@"/Users/lideshan/Desktop/test.plist"];
• 【*】NSMutableDictionary
• 【**】可变字典,继承NSDictionary,可以对其中的元素进行增删改
• 【**】创建
• [NSMutableDictionary dictionary];
• [NSMutableDictionarydictionaryWithCapacity:10]
• 【*】添加或修改元素
• [dictM setObject:@4 forKey:@"d"];
• dictM[@"a"] = @10;
• 【*】删除元素
• 删除某个key对应的键值对
• [dictMremoveObjectForKey:@"a"]
• 删除数组中所有的key对应的键值对
• [dictMremoveObjectsForKeys:@[@"a",@"b"]];
• 删除字典中所有元素
• [dictM removeAllObjects];
• 【*】遍历的同时删除元素
• 字典不支持遍历同时删除元素
• 可以先通过遍历的方式找出所有要删除的key,放在数组中,然后通过 removeObjectsForKeys:来删除
• Set【*】
• 特点:无序,元素不可以重复,可以用快速去除数组中的重复元素,效率比数组要高
• NSSet
• 特点:不可以变,一经创建不能增删改
• 创建
• 通过数组创建
• 如数组有重复的元素该方法会去重
• [NSSet setWithArray:array]
• [NSSet setWithObjects:@1,@2,@3,nil];
• 注意:不能通过简便的方式[字面量]创建
• 判断是否包含某个元素
• [set containsObject:@1];
• 遍历
• forin【 常用】
• for (NSNumber*num in set) {
• NSLog(@"%@",num);
• }
• 通过枚举器【少用】
• NSEnumerator *enumer = [set objectEnumerator];
• NSNumber *number;
• while (number = [enumer nextObject]) {
• NSLog(@"%@",number);
• }
• NSSet 与NSArray 之间的转换
• NSArray 转NSSet
• NSSet *set = [NSSetsetWithArray:array]
• NSSet 转NSArray
• NSArray *array = [set allObjects];
• NSMutableSet
• 特点:可以增删元素
• 创建
• [NSMutableSet set];
• [NSMutableSet setWithCapacity:10];
• 添加
• [setM addObject:@1];
• 删除
• [setM removeObject:@1];
• 【**】集合类之间的转换
• NSArray 转 NSMutableArray
• [NSMutableArray arrayWithArray:array];
• NSDictionary 转 NSMutableDictionary
• [NSMutableDictionary dictionaryWithDictionary:dict];
• NSSet 转 NSMutableSet
• [NSMutableSet setWithSet:set];
• NSArray 转 NSSet
• NSSet *set = [NSSet setWithArray:array];
• NSSet 转 NSArray
• NSArray *array = [set allObjects]
• NSDictionary 转NSArray
• NSArray * keys = [dict allKeys];
• NSArray * values = [dict allValues];
• 【**】集合类中的内存管理
• MRC
• 当你把一个对象放在集合类中的时候,集合会对这个对象进行一次retain操作
• 当你把一个对象从集合类移除的时候,集合会对这个对象进行一次
• 当集合销毁的时候,会对集合类中的所有对象进行一次release的操作
• ARC
• 当你把一个对象添加到集合中,集合会对这个对象有一个强引用
• 当你吧一个对象从集合中移除的时候,集合会释放掉对这个对象的强引用
• 当集合销毁的时候,会释放掉集合中所有对象的强引用
• 【**】常用结构体
• NSRange
• 表示一个区间
• location 表示起点
• length 表示长度
• NSPoint/CGPoint
• 表示平面上一个点
• x 表示x坐标
• y 表示y坐标
• NSSize/CGSize
• 表示尺寸(大小)
• width 宽
• height 高
• NSRect/CGRect
• 表示平面上的一个区域
• origin 位置(CGPoint)
• size 尺寸(CGSize)
• 创建方法【**】
• CGPoint创建
• CGPointMake(CGFloat x, CGFloat y)
• CGSize创建
• CGSizeMake(CGFloat width, CGFloat height)
• CGRectMake 创建
• CGRectMake(CGFloat x, CGFloat y, CGFloatwidth, CGFloat height)
• 结构体转字符串【*】
• NSRange转字符串
• NSStringFromRange(NSRange range)
• NSPoint转字符串
• NSStringFromPoint(NSPoint aPoint)
• NSSize转字符串
• NSStringFromSize(NSSize aSize)
• NSRect 转字符串
• NSStringFromRect(NSRect aRect)
• 【**】基本数据类型包装类NSNumber
• 基本类转包装类型
• [NSNumbernumberWithInt:(int)];
• [NSNumber numberWithChar:(char)];
• [NSNumbernumberWithDouble:(double)];
• [NSNumbernumberWithFloat:(float)];
• [NSNumbernumberWithBool:(BOOL)];
• 包装类型转基本类型
• number.intValue;
• number.floatValue;
• number.doubleValue;
• number.charValue;
• number.boolValue
• 【**】 结构体的包装类NSValue
• 结构体转NSValue
• 常见结构体转换
• [NSValue valueWithRange:(NSRange)];
• [NSValue valueWithPoint:(NSPoint)];
• [NSValue valueWithSize:(NSSize)];
• [NSValue valueWithRect:(NSRect)];
• 自定义结构体转换
• [NSValue valueWithBytes:(const void *) valueobjCType:(const char *)] type]
• value 普通的结构体指针
• type @encode(C语言的结构体类型)
• typedef struct {
• double width;
• double height;
• } MYSize;
• MYSize size = {2,10};
• NSValue *value = [NSValuevalueWithBytes:&size objCType:@encode(MYSize)];
• NSValue 转结构体
• 常见结构转换
• value.rangeValue;
• value.pointValue;
• value.sizeValue;
• value.rectValue;
• 自定义结构体转换
• [value getValue:&size];
• 【*】NSDate
• 【**】创建日期
• NSDate *date = [NSDatedate];
• NSDate *da = [[NSDatealloc] init];
• + (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
• NSLog(@"%@",date);输出的时间是格林威治标准时间
• 本初子午线穿过哪里
• 【**】日期格式化
• // 创建日期
• NSDate *date = [NSDatedate];
• // 创建日期格式化器
• NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
• // 设置日期格式
• formatter.dateFormat = @"yyyy年MM月dd日 HH时mm分ss秒Z";
• // yyyy:年 MM:月 dd:日hh:时 mm:分 ss:秒 Z代表时区
• // 将日期转换为指定格式的字符串
• NSString *dateStr = [formatter stringFromDate:date];
• NSLog(@"%@",dateStr);
• // 将格式字符串转为日期
• NSDate *newDate = [formatter dateFromString:dateStr];
• NSLog(@"%@",newDate);
• 【*】日期比较
• 判断两个日期是否相同
• BOOL isEqual = [date1 isEqualToDate:date2];
• 日期比较
• NSComparisonResult res = [date1 compare:date2];
• 返回两个日期中较早一个
• NSDate * earlierDate = [date1 earlierDate:date2];
• 返回两个日期中较晚的一个
• NSDate *laterDate= [date1 laterDate:date2];
• 【*】NSCalendar
• 日历:主要用于日期的计算
• 获取当前的日历对象
• NSCalendar *calendar = [NSCalendarcurrentCalendar];
• 取出日期的某一部分
• // 1.当前时间
• NSDate *now = [NSDatedate];
• // 2.创建一个日历对象
• NSCalendar *calendar = [NSCalendarcurrentCalendar];
• // 3.利用日历对象或者时间对象对应的年、月、日、时分秒
• int unit = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay;
• NSDateComponents *cmps = [calendar components:unit fromDate:now];
• // 4.打印时间的要素
• NSLog(@"%ld",cmps.day);
• 计算两个日期之间相差的时间
• NSString *time1 = @"2014-12-0820:50:40";
• NSString *time2 = @"2014-12-0418:45:30";
•
• NSDateFormatter *fmt = [[NSDateFormatteralloc] init];
• fmt.dateFormat = @"yyyy-MM-ddHH:mm:ss";
•
• NSDate *date1 = [fmt dateFromString:time1];
• NSDate *date2 = [fmt dateFromString:time2];
•
• // 1.创建一个日历对象
• NSCalendar *calendar = [NSCalendarcurrentCalendar];
•
• // 2.比较时间的差距
• int unit = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay
• | NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond;
• NSDateComponents *cmps = [calendarcomponents:unit fromDate:date2 toDate:date1 options:0];
•
• NSLog(@"相差%ld年%ld月%ld天%ld小时%ld分钟%ld秒", cmps.year,cmps.month, cmps.day,cmps.hour, cmps.minute,cmps.second);
• 在原来的日期的基础上添加时间
• NSDate *newDate = [calendar dateByAddingComponents:cmps toDate:date options:NSCalendarMatchStrictly];
• 【*】文件操作
• 【*】文件管理器NSFileManager
• 概念:该类是一个单例类,用于文件相关的操作
• 获取文件管理器
• NSFileManager * defaultManager= [NSFileManager defaultManager];
• 【*】判断是该路径下是否存在文件或文件夹
• BOOL isExist = [fileManagerfileExistsAtPath:path];
• BOOL isDir = NO;
• BOOL isExist = [fileManagerfileExistsAtPath:path isDirectory:&isDir];
• 如果是目录isDir的值为YES,
• 注意:1、这里传入的是一个BOOL类型的变量的地址
• 2、只有文件存在才会判断他是路径还是文件,如果路径或文件不存两个值都是NO
• 【*】文件权限
• 判断文件是否可读的
• BOOL isReadable =[fileManager isReadableFileAtPath:path];
• 判断文件是否是可写的
• BOOL isWritable =[fileManager isWritableFileAtPath:path];
• 【*】获取文件或目录的属性
• NSFileManager *fileManager = [NSFileManager defaultManager];
• NSString *path =@"/Users/lideshan/Desktop";
• NSError *error;
• NSDictionary *dict = [fileManager attributesOfItemAtPath:patherror:&error];
• NSLog(@"%@",dict);
• NSLog(@"%@",dict[@"NSFileSize"]);//我们可以通过这个属性获取文件的大小
• NSLog(@"%@",dict[NSFileSize]);//与上面的方式是等价的,我们通常使用这一种
•
• 【*】获取目录的内容
• 获得当前文件夹下的内容
• NSError *error = nil;
• NSArray *array = [fileManagercontentsOfDirectoryAtPath:path error:&error];
• 获得当前文件夹下及其子文件夹的内容
• NSError *error = nil;
• NSArray *array = [fileManagersubpathsOfDirectoryAtPath:path error:&error];
• 【*】拷贝文件(原文件保留)
• [fileManagercopyItemAtPath:src toPath:dest error:&error];
• 【*】移动文件(原文件会被删除)
• [fileManager moveItemAtPath:src toPath:desterror:&error];
• 【**】创建目录
• [fileManager createDirectoryAtPath:destwithIntermediateDirectories:NO attributes:nil error:&error];
• withIntermediateDirectories:是否要创建中间目录
• YES 表示创建中间目录
• NO 表示不创建中间目录
• attributes: 是目录的属性信息,nil表示使用默认属性
• 【**】创建文件
• [fileManager createFileAtPath:destcontents:data attributes:nil];
• 【**】NSData
• 概念: IOS中二进制文件使用NSData保存
• 音频、视频文件必须使用NSData来保存
• 把文件加载到内存
• NSData *data = [NSData dataWithContentsOfFile:path];
• 注意: NSData是不可变的Data类型,只能通过一次加载,完成所有的数据加载
• 把内存中的数据写入到文件中
• [data writeToFile:path atomically:YES];
• 【**】NSMutableData
• 当你需要把多个NSData数据拼接成一个数据存储的时候,就要使用NSMutableData
• NSMutableData *dataM = [NSMutableDatadata];
• [dataM appendData:data];
• 【*】NSObject
• 判断某个实例对象是否实现某个方法
• - (BOOL)respondsToSelector:(SEL)aSelector;
• 让某个实例对象动态去执行某个方法
• - (id)performSelector:(SEL)aSelector;
• - (id)performSelector:(SEL)aSelector withObject:(id)object;
• - (id)performSelector:(SEL)aSelector withObject:(id)object1withObject:(id)object2;
• 判断一个实例对象是否是一个类的实例对象
• - (BOOL)isMemberOfClass:(Class)aClass;
• 判断一个实例对象是否是一个类 或其子类的实例对象
• - (BOOL)isKindOfClass:(Class)aClass;
• 判断一个实例对象是否实现了某个协议
• - (BOOL)conformsToProtocol:(Protocol*)aProtocol;
• 【*】复制
• 不可变对象
• 一经创建不可增加、删除、修改的对象,只要是对对象中内容进行修改添加删除的操作的方法都会返回一个全新的对象,而原来的对象不受影响
• NSString,NSArray,NSDictionary,NSSet
• 可变对象
• 创建后可以进行增删改对象,可以在原来的对象的基础上进行增删改,当一个对象中的元素需要经常进行增删改的操作的时候,使用可变对象效率更高
• NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableSet
• 浅复制
• 不会产生新对象的复制
• NSString调用copy : 浅复制
• 如果是不可变对象调用copy方法产出不可变副本,那么不会产生新的对象
• 深复制
• 会产生全新的对象的复制
• NSString调用mutableCopy : 深复制
• NSMutableString调用copy : 深复制
• NSMutableString调用mutableCopy : 深复制
• 可变对象上调用copy 或 mutableCopy都会产生一个全新的对象,不可变量对象调用 mutableCopy会产生一个新对象
• 复制与引用计数器
• 在MRC中,不可变对象调用copy方法,引用计数+1(NSString除外),不可变对象调用mutableCopy会产生一个全新的对象引用计数为1,可变对象调用copy 或mutableCopy都会产生一个全新的对象,引用计数为1
文章浏览阅读3.3k次,点赞7次,收藏39次。CPU 执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对异常情况或特殊请求进行处理,处理完毕后再返回现行程序断点处,继续执行原程序。void 函数名(void) interrupt n using m {中断函数内容 //尽量精简 }编译器会把该函数转化为中断函数,表示中断源编号为n,中断源对应一个中断入口地址,而中断入口地址的内容为跳转指令,转入本函数。using m用于指定本函数内部使用的工作寄存器组,m取值为0~3。该修饰符可省略,由编译器自动分配。_51单片机中断篇
文章浏览阅读396次。项目经验(案例一)项目时间:2009-10 - 2009-12项目名称:中驰别克信息化管理整改完善项目描述:项目介绍一,建立中驰别克硬件档案(PC,服务器,网络设备,办公设备等)二,建立中驰别克软件档案(每台PC安装的软件,财务,HR,OA,专用系统等)三,能过建立的档案对中驰别克信息化办公环境优化(合理使用ADSL宽带资源,对域进行调整,对文件服务器进行优化,对共享打印机进行调整)四,优化完成后..._网络工程师项目经历
文章浏览阅读1k次,点赞31次,收藏30次。LVS:Linux Virtual Server,负载调度器,内核集成, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现。NATTUNDR优点端口转换WAN性能最好缺点性能瓶颈服务器支持隧道模式不支持跨网段真实服务器要求anyTunneling支持网络private(私网)LAN/WAN(私网/公网)LAN(私网)真实服务器数量High (100)High (100)真实服务器网关lvs内网地址。
文章浏览阅读899次。https://www.toutiao.com/a6713171323893318151/作者 | 黄小邪/言有三编辑 | 黄小邪/言有三图像预处理算法的好坏直接关系到后续图像处理的效果,如图像分割、目标识别、边缘提取等,为了获取高质量的数字图像,很多时候都需要对图像进行降噪处理,尽可能的保持原始信息完整性(即主要特征)的同时,又能够去除信号中无用的信息。并且,降噪还引出了一..._噪声很大的图片可以降噪吗
文章浏览阅读152次。目录谨慎地覆盖cloneCloneable接口并没有包含任何方法,那么它到底有什么作用呢?Object类中的clone()方法如何重写好一个clone()方法1.对于数组类型我可以采用clone()方法的递归2.如果对象是非数组,建议提供拷贝构造器(copy constructor)或者拷贝工厂(copy factory)3.如果为线程安全的类重写clone()方法4.如果为需要被继承的类重写clone()方法总结谨慎地覆盖cloneCloneable接口地目的是作为对象的一个mixin接口(详见第20_为继承设计类有两种选择,但无论选择其中的
文章浏览阅读958次,点赞21次,收藏24次。今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统项目运行效果:项目获取:https://gitee.com/assistant-a/project-sharing21世纪是信息化时代,随着信息技术和网络技术的发展,信息化已经渗透到人们日常生活的各个方面,人们可以随时随地浏览到海量信息,但是这些大量信息千差万别,需要费事费力的筛选、甄别自己喜欢或者感兴趣的数据。对网络电影服务来说,需要用到优秀的协同过滤推荐功能去辅助整个系统。系统基于Python技术,使用UML建模,采用Django框架组合进行设
文章浏览阅读614次。10G SFP+光模块被广泛应用于10G以太网中,在下一代移动网络、固定接入网、城域网、以及数据中心等领域非常常见。下面易天光通信(ETU-LINK)就为大家一一盘点下10G SFP+光模块都有哪些吧。一、10G SFP+双纤光模块10G SFP+双纤光模块是一种常规的光模块,有两个LC光纤接口,传输距离最远可达100公里,常用的10G SFP+双纤光模块有10G SFP+ SR、10G SFP+ LR,其中10G SFP+ SR的传输距离为300米,10G SFP+ LR的传输距离为10公里。_10g sfp+
文章浏览阅读239次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:项目技术:Express框架 + Node.js+ Vue 等等组成,B/S模式 +Vscode管理+前后端分离等等。环境需要1.运行环境:最好是Nodejs最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发环境:Vscode或HbuilderX都可以。推荐HbuilderX;3.mysql环境:建议是用5.7版本均可4.硬件环境:windows 7/8/10 1G内存以上;_基于vue美食网站源码
文章浏览阅读62次。oldwain随便写@hexun链接:http://oldwain.blog.hexun.com/ ...
文章浏览阅读843次,点赞16次,收藏22次。用这个工具扫描其它网站时,要注意法律问题,同时也比较慢,所以我们以之前写的登录页面为例子扫描。_sqlmap拖库
文章浏览阅读1.5w次,点赞5次,收藏38次。Origin也能玩转图片的拼接组合排版谭编(华南师范大学学报编辑部,广州 510631)通常,我们利用Origin软件能非常快捷地绘制出一张单独的绘图。但是,我们在论文的撰写过程中,经常需要将多种科学实验图片(电镜图、示意图、曲线图等)组合在一张图片中。大多数人都是采用PPT、Adobe Illustrator、CorelDraw等软件对多种不同类型的图进行拼接的。那么,利用Origin软件能否实..._origin怎么把三个图做到一张图上
文章浏览阅读4.2k次,点赞4次,收藏51次。51单片机智能电风扇控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0042。_电风扇模拟控制系统设计