IOS开发之OC学习笔记(下)
2016-04-06 23:40
513 查看
该笔记源自本人对一个网络视频的学习
百度网盘链接 ,密码: tp3a
如有侵权,请联系本人删除。
都是比较基础的OC知识,中高级开发者可以忽略本文
很多重要内容在代码注释中
由于NSDictionary是不可变的,所以只能取值,而不能修改值
将字典写入文件中
从文件中读取内容
返回所有的key或者value
根据多个key取出对应的多个value
当key找不到对应的value时,用marker参数值代替
结果:objects= (v1,v2,”not-found”)
isMemberOfClass判断对象是否属于某个类(不包括子类)
直接调用
间接调用
延迟2秒后调用test2:方法
百度网盘链接 ,密码: tp3a
如有侵权,请联系本人删除。
都是比较基础的OC知识,中高级开发者可以忽略本文
很多重要内容在代码注释中
1. Foundation-NSDictionary
字典的初始化:
// NSDictionary是不可变的 NSDictionary *dict = [NSDictionary dictionaryWithObject:@"v" forKey:@"k"]; //{k = v;} // 最常用的初始化方式 dict = [NSDictionary dictionaryWithObjectsAndKeys: @"v1", @"k1", @"v2", @"k2", @"v3", @"k3", nil]; NSArray *objects = [NSArray arrayWithObjects:@"v1", @"v2", @"v3", nil]; NSArray *keys = [NSArray arrayWithObjects:@"k1", @"k2", @"k3", nil]; dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; // {k1 = v1;k2 = v2;k3 = v3;} NSLog(@"%@", dict);
字典的基本用法:
有多少个键值对(key-value)dict.count
由于NSDictionary是不可变的,所以只能取值,而不能修改值
id obj = [dict objectForKey:@"k2"];
将字典写入文件中
NSString *path = @"/Users/apple/Desktop/dict.xml"; [dict writeToFile:path atomically:YES];
从文件中读取内容
dict = [NSDictionary dictionaryWithContentsOfFile:path];
返回所有的key或者value
NSArray *keys = [dict allKeys];
NSArray *objects = [dict allValues];
根据多个key取出对应的多个value
当key找不到对应的value时,用marker参数值代替
objects = [dict objectsForKeys:[NSArray arrayWithObjects:@"k1", @"k2", @"k4", nil] notFoundMarker:@"not-found"];
结果:objects= (v1,v2,”not-found”)
遍历字典的所有key或者value:
//方法一 for循环 for (id key in dict) { id value = [dict objectForKey:key]; NSLog(@"%@=%@", key, value); }
//方法二 key迭代器 NSEnumerator *enumer = [dict keyEnumerator]; id key = nil; while ( key = [enumer nextObject]) { id value = [dict objectForKey:key]; NSLog(@"%@=%@", key, value); } //k3=v3 k2=v2 k1=v1 for (NSObject *object in [dict objectEnumerator]) { NSLog(@"对象迭代器遍历的值: %@",object); } //v3 v2 v1
//方法三 use block [dict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) { NSLog(@"%@=%@", key, obj); }];
字典的内存管理:
Student *stu1 = [Student studentWithName:@"stu1"]; Student *stu2 = [Student studentWithName:@"stu2"]; Student *stu3 = [Student studentWithName:@"stu3"]; // 一个对象称为字典的key或者value时,会做一次retain操作,也就是计数器会+1 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: stu1, @"k1", stu2, @"k2", stu3, @"k3", nil]; // 当字典被销毁时,里面的所有key和value都会做一次release操作,也就是计数器会-1
2. Foundation-NSMUtableDictonary
可变字典的使用// 创建一个空的字典 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; Student *stu1 = [Student studentWithName:@"stu1"]; Student *stu2= [Student studentWithName:@"stu2"]; // 添加元素 // stu1的计数器会+1 [dict setObject:stu1 forKey:@"k1"]; NSLog(@"stu1:%zi", [stu1 retainCount]); // 添加其他字典other到当前字典dict中 NSDictionary *other = [NSDictionary dictionaryWithObject:@"v2" forKey:@"k2"]; [dict addEntriesFromDictionary:other]; // 删除所有的键值对 // [dict removeAllObjects]; // 删除k1对应的元素stu1,stu1会做一次release操作 [dict removeObjectForKey:@"k1"]; NSLog(@"stu1:%zi", [stu1 retainCount]); // 删除多个key对应的value // [dict removeObjectsForKeys:[NSArray arrayWithObject:@"k1"]]; // 字典被销毁时,内部的所有key和value计数器都会-1,也就是说stu1会release一次
3. Foundation-NSNumber
// 将int类型的10 包装成 一个NSNumber对象 NSNumber *number = [NSNumber numberWithInt:10]; NSLog(@"number=%@", number); // 添加数值到数组中 NSMutableArray *array = [NSMutableArray array]; [array addObject:number]; // 取出来还是一个NSNumber对象,不支持自动解包(也就是不会自动转化为int类型) NSNumber *number1 = [array lastObject]; // 将NSNumber转化成int类型 int num = [number1 intValue]; NSLog(@"num=%i", num);
4. Foundation-NSValue
将结构体变量包装成一个对象CGPoint point = CGPointMake(10, 10); NSValue *value = [NSValue valueWithPoint:point]; NSMutableArray *array = [NSMutableArray array]; [array addObject:value];// 添加value // 取出当时放进去的value NSValue *value1 = [array lastObject]; CGPoint point1 = [value1 pointValue]; BOOL result = CGPointEqualToPoint(point1, point);
typedef struct { int year; int month; int day; } Date; void value2() { Date date = {2013, 4, 7}; // 这里要传结构体的地址&date // 根据结构体类型生成 对应的 类型描述字符串 char *type = @encode(Date); NSValue *value = [NSValue value:&date withObjCType:type]; Date date1;// 定义一个结构体变量 [value getValue:&date1];// 取出包装好的结构体 // [value objCType]; 取出类型描述字符串 NSLog(@"year=%i, month=%i, day=%i", date1.year, date1.month, date1.day); //year=2013, month=4, day=7 }
5. Foundation-NSNull
// [NSNull null]返回的是同一个单粒对象 NSNull *n = [NSNull null]; NSNull *n1 = [NSNull null]; NSLog(@"%i", n == n1);//1
6. Foundation-NSDate
日期创建
// date方法返回的就是当前时间(now) NSDate *date = [NSDate date]; NSLog(@"11:%@", date);//11:2016-04-06 14:42:19 +0000 // now: 11:12:40 // date: 11:12:50 date = [NSDate dateWithTimeIntervalSinceNow:10]; NSLog(@"22:%@", date);//22:2016-04-06 14:42:29 +0000 // 从1970-1-1 00:00:00开始 date = [NSDate dateWithTimeIntervalSince1970:10]; NSLog(@"33:%@", date);//33:1970-01-01 00:00:10 +0000 // 随机返回一个比较遥远的未来时间 date = [NSDate distantFuture]; NSLog(@"44:%@", date);//44:4001-01-01 00:00:00 +0000 // 随机返回一个比较遥远的过去时间 date = [NSDate distantPast]; NSLog(@"55:%@", date);//55:0000-12-30 00:00:00 +0000
日期使用
NSDate *date = [NSDate date]; // 返回1970-1-1开始走过的毫秒数 NSTimeInterval interval = [date timeIntervalSince1970]; NSLog(@"interval = %f",interval);//1459954262.860866 NSDate *date2 = [NSDate date]; // 返回比较早的那个时间 NSLog(@"%@",[date earlierDate:date2]);//2016-04-06 14:51:02 +0000 // 返回比较晚的那个时间 NSLog(@"%@",[date laterDate:date2]);//2016-04-06 14:51:02 +0000 // 跟其他时间进行对比 interval =[date2 timeIntervalSinceDate:date]; NSLog(@"interval = %f",interval);//0.001233
日期格式化
NSDate *date = [NSDate date]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // HH是24进制,hh是12进制 formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; //修正stringFromDate时区差异 //formatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"] autorelease]; NSString *string = [formatter stringFromDate:date]; NSLog(@"%@", string); // 返回的格林治时间 NSDate *date2 = [formatter dateFromString:@"2010-09-09 13:14:56"]; NSLog(@"%@", date2);//2010-09-09 05:14:56 +0000 [formatter release];
7. Foundation-NSObject
NSObject使用
isKindOfClass判断对象是否属于某个类 或者 子类if ( [stu isKindOfClass:[Person class]] ) { // NSLog(@"stu属于Person或者继承自Person");}
isMemberOfClass判断对象是否属于某个类(不包括子类)
BOOL result = [stu isMemberOfClass:[Student class]];
直接调用
[stu test];
间接调用
[stu performSelector:@selector(test)];
[stu performSelector:@selector(test2:) withObject:@"abc"];
延迟2秒后调用test2:方法
[stu performSelector:@selector(test2:) withObject:@"abc" afterDelay:2];
反射的使用
// 类的反射 NSString *str = @"Person"; Class class = NSClassFromString(str); Person *person = [[class alloc] init]; NSLog(@"%@", person);//<Person: 0x100300320> // Class变成字符串 NSString *name = NSStringFromClass([Person class]); NSLog(@"%@", name);//Person // 方法的反射 NSString *method = @"test"; SEL selector = NSSelectorFromString(method); [person performSelector:selector];//调用了Person的test方法 // 将SEL转换为字符串 NSString *selectorName = NSStringFromSelector(selector); NSLog(@"%@", selectorName);//test [person release];
相关文章推荐
- ios设计模式之MVC体系
- iOS 屏幕适配
- iOS里面的屏幕适配(两种方法)
- iOS 取消按钮高亮显示方法
- iOS copy mutableCopy 的实现
- IOS学习 NSOperation 并发数量、暂停/继续、取消、等待、依赖 与GCD区别
- iOS wkwebkit 播放HTML5 视频 全屏问题解决
- iOS_主要的函数
- iOS设计中不同屏幕适配的方法-登陆界面
- iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置
- iOS中WebSocket的使用
- iOS之旅-越过坑点
- ios定位
- IOS openGL es 学习一
- iOS——程序启动过程
- 在ios中自定义tabbar跳转隐藏问题
- iOS 单独设置某个控制器横屏 —— HERO博客
- IOS程序开发概览
- iOS 开发技巧 更新
- iOS tableView 静态单元格的实现