黑马程序员技术交流社区
标题:
OC加强最后一天笔记
[打印本页]
作者:
魏武
时间:
2015-9-1 23:34
标题:
OC加强最后一天笔记
/****************************NSDictionary***************************/
一、 NSDictionary
1,NSDictionary的介绍和特点
1),NSDictionary翻译过来叫做”字典”;
2),NSDictionary的作用类似: 通过一个key(键), 就能找到对应的value(值);
3),NSDictionary是不可变的, 一旦初始化完毕, 里面的内容就无法修改;
4),字典存储的时候,必须是"键值对"的方式来存储(同时键不要重复);如果重复,最后添加的将不能保存到字典中;
5),键值对中存储的数据是"无序的";
6),键值对集合可以根据键, 快速获取数据;
7),字典的key值和value值都必须是对象;
2,NSDictionary的基本使用
1),创建
+ (instancetype)dictionary;
+ (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
2),快速创建
格式:
@{key:value, key:value,...};
NSDictionary字面量
NSDictionary *dict4 = @{@"zs":@"zhaosi",@"zs":@"zhangsan",@"ls":@"lisi",@"bz":@"banzhang"};//key:value; json
3),其他操作
- (NSUInteger)count; 返回字典的键值对数目
- (id)objectForKey:(id)aKey; 根据key取出value
通过key获取value的简写形式:
NSString *value = dict4[@"zs"];//value 是 zhaosi
4),遍历
第一种方式:
//第一步:获取所有的key
//第二步:根据key获取value
for(NSString *key in dict4){
NSLog(@"---key = %@,value = %@",key,[dict4 objectForKey:key]);
NSString *value = dict4[key];
}
第二种方式:
[dict4 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@ --> %@",key,obj);
}];
3,NSDictionary文件操作
*****"将字典保存城市数组的例子练习一遍"*****
1),将字典写入文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
2),从文件中读取字典
+ (id)dictionaryWithContentsOfFile:(NSString *)path;
+ (id)dictionaryWithContentsOfURL:(NSURL *)url;
4,NSMutableDictionary
1),介绍
NSMutableDictionary是NSDictionary的子类;
NSDictionary是不可变的, 一旦初始化完毕后, 它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素;
NSMutableDictionary是可变的, 随时可以往里面添加\更改\删除元素;
2),常用方法
添加一个键值对(会把aKey之前对应的值给替换掉)
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
修改值
- (void)setValue:(id)value forKey:(NSString *)key;
通过aKey删除对应的value
- (void)removeObjectForKey:(id)aKey;
删除所有的键值对
- (void)removeAllObjects;
5,NSDictionary和NSArray区别 (面试题)
1> NSArray是有序的,NSDictionary是无序的;key
2>,NSArray存储的是单独的对象,NSDictionary存储的是键值对;
3> NSArray是通过下标访问元素,NSDictionary是通过key访问元素;
4>,NSArray的简写创建:
@[@"Jack", @"Rose"] (返回是不可变数组)
5>,NSDictionary的简写创建:
@{@"zs":@"zhaosi",@"zs":@"zhangsan"};(返回是不可变字典)
/****************************NSFileManager***************************/
二,NSFileManager
1,NSFileManager介绍
顾名思义, NSFileManager是用来管理文件系统的 ,
它可以用来进行常见的文件\文件夹操作(拷贝、剪切、创建等)
2,创建文件管理者对象(是一种单利模式)
NSFileManager *fm = [NSFileManager defaultManager];
3,NSFileManager基本判断
1),判断path这个文件或文件夹(目录)是否存在
- (BOOL)fileExistsAtPath:(NSString *)path;
2),判断path这个路径是否是一个目录
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
示例:
BOOL isDir;
[fm fileExistsAtPath:filePath isDirectory:&isDir];
if (isDir) {
NSLog(@"这是一个目录");
}else{
NSLog(@"这不是一个目录");
}
3),判断path这个文件或文件夹是否可读
- (BOOL)isReadableFileAtPath:(NSString *)path;
4),判断path这个文件或文件夹是否可写
- (BOOL)isWritableFileAtPath:(NSString *)path;
5),判断path这个文件或文件夹是否可删除
- (BOOL)isDeletableFileAtPath:(NSString *)path;
4,NSFileManager基本用法
1),获得path这个文件\文件夹的属性
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
2),查找给定路径下的所有子路径,返回一个数组
- (NSArray *)subpathsAtPath:(NSString *)path;
3),获得path的所有子路径,跟2)的方法功能一样。(不是使用递归的方式获取的)
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
4),获得path的当前子路径(path下的所有直接子内容,path必须是一个目录)
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
5),获取指定目录下的文件及目录信息(不在获取后代路径)
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
//------------------------------------------------------------------------------------
下午:
5,NSFileManager深入用法
1),创建目录
参数: 1,路径;2,是否自动创建路径中的所有文件夹;3,文件夹属性; 4,错误信息
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error
2),创建文件
参数:1,路径;2,NSData类型的数据;3,文件的属性;
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
/************************/
字符串转NSData:(NSData 是一个处理二进制数据的类)
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; *****
/************************/
3),拷贝文件,从srcPath这个路径拷贝到dstPath这个路径
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
4),移动文件,从srcPath这个路径移动到dstPath这个路劲
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;;
5),删除文件
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
三,iOS沙盒机制
应用沙盒一般包括以下几个文件目录:Documents、Libaray(下面有Caches和 Preferences目录)、tmp。
1,Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录 。
2,Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。
1),Libaray/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。一 般存放体积比较大,不是特别重要的资源。
2),Libaray/Preferences:保存应用的所有偏好设置,ios的Settings(设置)应用会在该目录中查找 应用的设置信息,iTunes会自动备份该目录。
3,tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也有可能会清除该目录下的文件,iTunes不会同步该目录。iphone重启时,该目录下的文件会丢失。
代码:
1,获取沙盒根目录的方法
NSString *sandBoxPath = NSHomeDirectory();
2,获取沙盒根目录,返回绝对路径 Documents
参数:1,NSDocumentDirectory 表示获取沙盒的Documents目录;2,NSUserDomainMas 用户主目录中;3,YES/NO 是否获取全路径;
NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
3,Cache目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
4,Libaray目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
/*************************************************************/
//拼接字符串 stringByAppendingPathComponent
NSString *str = [filePath stringByAppendingPathComponent:@"Preferences/1.txt"];
/*************************************************************/
5,tmp目录
NSString *tmpDir = NSTemporaryDirectory();
作者:
魏武
时间:
2015-9-1 23:35
四,常见的结构体
1,NSPoint和CGPoint的使用
1),NSPoint和CGPoint的定义:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef CGPoint NSPoint;
CGPoint和NSPoint是同义的 ;
2),赋值方式:
CGPoint c1; //c1是一个CGPoint结构体类型的变量
c1.x = 20;
c1.y = 100;
CGPoint c2 = {10,10};//NSPoint同理
CGPoint C3 = {.x = 10};
//OC中特有的赋值方式
CGPoint c4 = CGPointMake(10, 10);
NSPoint np2 = NSMakePoint(5, 5);
2,NSSize和CGSize的使用
1),NSSize和CGSize的定义:
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef CGSize NSSize;
CGSize和NSSize是同义的;
2),赋值方式:
CGSize s1 ;
s1.width = 200;
s1.height = 100;
//OC中特有的方式
CGSize s2 = CGSizeMake(100, 100);
NSSize ns = NSMakeSize(10, 10);
3,NSRect和CGRect的使用
1),NSRect和CGRect的定义:
struct {
CGPoint origin;
CGSize size;
};
typedef CGRect NSRect;
CGRect和NSRect是同义的
2),赋值方式:
第一种:
CGRect r1;
//C语言赋值方式
r1.origin.x = 0;
r1.origin.y = 0;
r1.size.width = 200;
r1.size.height = 80;
第二种:
CGRect r2 = {{0,1},{20,34}};
第三种:
//OC特有的方式
// CGXXXX CGXXXXMake
CGRect r3 = CGRectMake(10, 10, 100, 30);
// NSXXXX NSMakeXXXX
NSRect nr1= NSMakeRect(10, 10, 50, 50);
结构体转字符串:
NSStringFromPoint(NSPoint aPoint);
NSStringFromSize(NSSize aSize);
NSStringFromRect(NSRect aRect);
注意:
苹果官方推荐使用CG开头的:
CGPoint
CGSize
CGRect
五,NSNumber的使用(装箱和拆箱)
1,功能:对基本数据类型进行包装;
用处:
NSArray\NSDictionary中只能存放OC对象, 不能存放int\float\double等基本数据类,
如果真想把基本数据(比如int)放进数组或字典中, 需要先将基本数据类型包装成OC对象 。
2,包装的方法:(装箱)
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
3,简写方式:(NSNumber字面量)
@10;
@10.5;
@YES;
@(num); // 如果是变量必须加()
4,NSNumber转成基本数据类型:(拆箱)
- (char)charValue;
- (int)intValue;
- (long)longValue;
- (double)doubleValue;
- (BOOL)boolValue;
一,NSValue
1,NSValue的介绍和使用:
功能:是将结构体转换成oc对象;方便存储于字典和数组中;
2,为了方便结构体和NSValue的转换, Foundation提供了以下方法 ,将结构体包装成NSValue对象:
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
3,将NSValue转成相对应的结构体:
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;
4,自定义结构体转成NSValue对象:
参数:1,结构体地址; 2,接受一个数据类型的名称自动生成一个合适的描述字符串;
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
例子:
typedef struct D{
int year;
int month;
int day;
} MyDate; //MyDate是一个别名
MyDate md = {2015,5,7};
//@encode(MyDate) 作用,把MyDate的类型生成一个常量字符串描述
NSValue *val = [NSValue valueWithBytes:&md objCType:@encode(MyDate)];
//定义一个数组,把val存到数组中
NSMutableArray *arr = [NSMutableArray arrayWithObject:val];
5,通过NSValue对象获取自定义结构体:
- (void)getValue:(void *)value;
例子:
MyDate tmd;
[arr[0] getValue:&tmd];
NSLog(@"%d,%d,%d",tmd.year,tmd.month,tmd.day);
二,NSDate
1,NSDate介绍:
NSDate可以用来表示时间, 可以进行一些常见的日期\时间处理;
一个NSDate对象就代表一个时间;
2,NSDate的使用:
1),获取当前时间:
NSDate *d1 = [NSDate date];//格式: 2015-05-07 09:00:25 +0000
2),格式化日期:
// yyyy 表示四位的年份
// MM 表示月份
// dd 表示天数
// HH 表示24小时制得小数 hh 12小时
// mm 表示分钟数
// ss 表示秒数
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy年MM月dd日 HH:mm:ss";
NSString *dateStr = [formatter stringFromDate:d1];
//结果 dateStr = 2015年07月24日 19:48:01
3),计算时间:
第一种方式:***
NSTimeInterval t = 60*60*24;
NSDate *tom = [NSDate dateWithTimeIntervalSinceNow:t];//明天的时间
NSDate *yes = [NSDate dateWithTimeIntervalSinceNow:-t];//昨天的时间
第二种方式:
//计算昨天的时间
NSDate *now = [NSDate date];
//当前时间-24小时的秒数
NSDate *zt = [now addTimeInterval:-t];
timeStr = [formatter stringFromDate:zt];
NSLog(@"zt = %@",timeStr);
4),获取单独的日期信息:
NSDate *d = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *coms = [cal components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:d];
NSLog(@"year:%ld,month:%ld,day:%ld",coms.year,coms.month,coms.day);
作者:
张健康ios0826
时间:
2015-9-2 17:51
没学到c,oc的英文量好大啊
作者:
驴小叔
时间:
2015-9-2 19:08
顶顶顶....
作者:
颖峰
时间:
2015-9-2 19:22
感觉好厉害的样子 努力吧 加油
作者:
贤90
时间:
2015-9-3 00:38
学习了
作者:
15325501970
时间:
2015-9-3 00:41
看不懂,有没加强的么?
作者:
0826iOS_sunzhen
时间:
2015-9-3 01:46
这个笔记不错,量足全面!给力,有待学习
作者:
chensc
时间:
2015-9-3 08:21
学习学习!
作者:
魏武
时间:
2015-9-3 16:35
15325501970 发表于 2015-9-3 00:41
看不懂,有没加强的么?
看我以前的笔记
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2