1 NSDictionary(不可变字典)
作用:通过键(key)可能找到对应的值(value)。
特点:键值成对出现 键不能重复 (后添加的不能显示) 键值对是无序的
创建字典
1) 创建空字典
NSDictionary *dic =[ NSDictionary dictionary];
创建一组键值对的字典
NSDictionary *dic=[ NSDictionary dictionaryWithObject:id(value )forKey id(key)];
创建多组键值对的字典
NSDictionary *dic=[ NSDictionary dictionaryWithObjectsandKyes:value ,key,value1,key2]; //value和key都是对象成对出现中间用逗号间隔
简写创建字典
NSDictionary *dic=@{@“key”:@“value”,.......};//
打印字典
NSLog(@“%@”,dic); //大括号 数组是小括号。
常用函数
count:返回键值对的组数
objectForKey:id(key):根据键取出值
for(NSString *key in dic){
NSLog(@“key=%@,vaule = %@”,key[ dic objectForKey:key]);
}
用block方法取值
[dic enumerateKeyAndObjectUsingBlock:^(id key),id obj,BOOL*stop]){
NSLog(@“key=%@,vaule = %@”,key,obj);
}];
简写形式取值
dic[key];
写文件
[dic writeToFile: 路径automically];
读文件
NSDictionary *dic=[ NSDictionary dictionaryWithContentsOfFile: 路径];
使用
通过字典和数组进行组合可以形成级联
//
// main.m
// 级联
//
// Created by ywxkdz on 15/11/23.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//定于数组记录山东省的地市
NSArray *sd=@[@"jinan",@"qingdao",@"linyi",@"weifang",@"rizhao"];
//定于数组记录辽宁省的地市
NSArray *ln=@[@"dalian",@"shenyang",@"tieling",@"anshan"];
//将地市数组与省对应形成字典
NSDictionary *dic=[NSDictionarydictionaryWithObjectsAndKeys:ln,@"liaoning",sd,@"shandong",nil];
//打印字典
NSLog(@"%@",dic);
//将字典写入到文件中
BOOL is= [dic writeToFile:@"/Users/ywxkdz/Desktop/basetest/MyOcTest/dic.plist" atomically:YES];
//判断是否写入成功
if (is) {
NSLog(@"succ");
}else{
NSLog(@"unsucc");
}
//从文件中读取字典内容
NSDictionary *dict=[NSDictionarydictionaryWithContentsOfFile:@"/Users/ywxkdz/Desktop/basetest/MyOcTest/dic.plist"];
//打印字典内容
NSLog(@"%@",dict);
//遍历字典
for (NSString *key in dict) {
NSLog(@"%@",dic[key]);
int i=0;
//遍历数组
for (NSString *city in dict[key]) {
NSLog(@"%d city=%@",++i,city);
}
}
}
return 0;
}
2 NSmutableDictionary(可变字典)
可变字典创建
NSmutableDictionary *dic=[ NSmutableDictionarydictionary];//空字典
NSmutableDictionary *dic=[ NSmutableDictionary dictionaryWithCapacity:5];//指定长度
添加元素
[dic setValue: id(value)forKey:id(key) ];
删除元素
[dic removeObjectForKey:id(key)] ;
[dic removeAllObject];
修改元素
[dic setObject:id(newvalue)ForKey:id(key)];
查找元素
[dic alKeys] //返回值类型 NSArray
3 NSFileManager(单例模式)
可以进行常见的操作
基本使用
NSString*path=@“path”;
NSFileManager*fmgr= [NSFileManager defaultManager];//创建文件单例对象
BOOLisExist=[ fmgr fileExistAtPath:path]; //是否存在
BOOLisDir;
[ fmgr fileExistAtPath:path isDirectory :&isDir];//返回值isDir YES 是目录 否则是文件
BOOLisReadable=[ fmgr isReadabletAtPath:path];//是否可读
BOOLisWriteable=[ fmgr isWriteabletAtPath:path];//是否可行
BOOLisDelable=[ fmgr isDeletabletAtPath:path];//是否可删
获取属性信息
NSDictionary*dic=[fmgr attributeOfItemAtPath: path];
获取指定目录下的文件及子目录
NSArray* subpath= [fmgr subpathAtPath:dirpath];//递归方式
NSArray* subpath= [fmgr subpathOfDirectory:dirpath errer:nil];//非递归
NSArray* subpath= [fmgr contectsOfDirectory:dirpath]; //只获取子目录或子文件
创建文件
BOOL isSucc=[fgmr createFileAtPath:路径……];//自动创建缺失目录
创建目录
BOOL isSucc=[fgmr createDirectoryAtPath:路径……];//自动创建缺失目录
复制
[ fmgr copyItemAtPath:源目录 toPath:目标目录]; //将文件或者目录copy到目标目录。
移动
[ fmgr moveItemAtPath:源目录 toPath:目标目录]; //将文件或者目录移动到目标目录。
删除
[ fmge removeItemAtPath:源目录]; //将文件或者目录删除。
4 文件下载思路
1) 客户端发送请求到服务器,请求下载某文件
2) 服务器发送响应,返回文件数据
3) 客户端利用NSData存放服务器返回的文件数据
4) 利用文件管理将数据写入到新文件中。
5 常见结构体
NSPoint和CGPoint
对比 NSRange学习
定义
structCGPoint{
CGFloatx; //x坐标
CGFloaty; //y 坐标
};
type struct CGPoint CGPoint;
typedef double CGFloat;
方法赋值
CGFloat *cgp = CGMakePoint(5,5);
NSSize和CGSize
类比NSPoint学习
表示面积大小weigth和heigth
NSRect和CGRect
表示矩形的起始点和大小 //嵌套结构体
NSRectrect ={{0,1},{5.4}}
NSRectrect= NSRectMake(x,y,w,h);
6 NSNumber
基本数据类型的包装类
int a=10;
NSNumber*intobj= [ NSNumber numberWithInt:a];
简写: NSNumber *intobj=@10;
必须经过取值才能使用对象的数值。
int b=[intobjvalue];
其他数据类型类同。
7 NSValue
NSNumber 是NSValue的子类主要把指针、枚举类型和结构体等包装成OC对象
用法类似 NSNumber
typedef struct{
intyear;
intmonth;
intday ;
}MyDate;
MyDate myday={2014,5,8}; //生成结构体并赋值
//将 MyDate 类型变量转换为对象
NSValue *md = [ NSValue valueWithBytes:&myday objCType: @encode(MyDate )];
&myday:传递变量地址
objCType: @encode(MyDate ):把MyDate类型生成一个常量字符串描述。
取对象结构体的值
MyDate myd;
[mdgetValue:&myd];//获取对象md的值存放在myd。
8 NSDate(日期类)
获取当前世界
NSDate *date =[ NSDate date]; //创建时间对象 初始化为当前时间。(格林威治时间)
格式化
NSDateFormatter *dateForm =[ NSDateFormatter new ];//生成对象
dateForm.dateFormat=@“yyyy年MM月dd日 HH:mm:ss”//设置格式
HH:24小时制
hh:12小时制
mm:两位分钟
格式化日期
NSString *darestr=[ dateForm stringFromDate:date];//格式化日期
计算日期
NSDate*date =[ NSDate dateWitnTimeIntercalSinceNow:秒数];//24*60*60
NSDate*date =[ NSDate addTimeIntercalSinceNow:秒数];//过时了
快速获取年月日时分秒
NSCalendar*cal =[ NSCalendar currentCalendar ];
NSDateComponents *coms=[cal components:枚举列表fromDate:date];
枚举列表中填获取哪些信息 年、月、日、时、分、秒。用竖线分隔
coms.year:获取年的值
比较日期差、
NSDateComponents*coms=[cal components:枚举列表 fromDate:date] toDate:date2;
9 集合对象的内存管理
将元素对象加入到集合对象中引用计数 +1
数组被销毁时数组先销毁 元素对象的引用计数 -1
元素对象被数组删除时引用计数 -1
普遍规律
集合对象调用 add 或insert方法 引用计数+1
集合对象调用 remove 或delete方法 引用计数+1
10 copy
copy的目的:使用某个对象的数据时,修改对象时候不影响原来对象内容
特点
对象和副本修改时互不影响。
使用
首先遵守NSCopy协议和NSMutableCopy协议
注意
copy是浅复制地址不变只是复制地址 MutableCopy深复制会重新分配空间
可变对象 -copy-> 不可变对象 //地址不变 引用计数+1
不可变对象 -copy-> 不可变对象 //地址不变 引用计数+1
可变对象 -MutableCopy-> 可变对象 //重新分配空间
不可变对象 - MutableCopy -> 可变对象//重新分配空间
copy的内存管理
11 @property中的copy关键字
MRC 下
copy :对象赋值之后就不会改变 适用于 NSString 和block
retain:其他OC对象
assign:基本数据类型
ARC下
copy:对象赋值之后就不会改变 适用于 NSString 和block
strong:其他OC 对象
weak:对象相互引用时
assign:基本数据类型
12 自定义的类实现自定义操作
步骤
1) 新建Person类,该类遵守NSCopy协议。
2) 实现copyWithZone方法返回对象的副本
3) 在copyWithZone方法中创建新的对象并设置对象的数据与现在对象一直,返回新对象
4) 使用 copyWithZone对象方法创建对象
copyWithZone实现
-(id)copyWithZone(NSZone *)zone{ //可以忽略zone
Person *p =[[Person alloc] init]; //新建对象
p.speed=self.age; //将调用者的成员变量值赋值给新建对象
}
13 简单的单例模式
程序运行期间类的对象成为唯一的实例。提供访问点,共享资源。
设计要点
类只有一个实例
必须自己创建对象
必须保证唯一性
必须向系统提供实例
设计实现
创建类(SingletonTools)
类实现文件(.m)中定义静态的单例对象
staticSingletonTools *instance =nil;
声明和实现 共享方法
+(instancetype) shareInstaces{
if(instance== nil){
instance=[SingletonTools new];
}
return instance;
}
重写可以创建对象的方法,将所有的方法全部调用该shareInstaces 方法
+(id)copyWithZone:(NSZone*)zone
+(id)allocWithZone:(NSZone*)zone
-(id)retain
-(NSUInteger) retainCount
-(oneway void) release
-(id)autorelease