ObjC类与属性的copy关键字
2016-02-25 16:58
459 查看
1. NSFileManager类管理文件系统
作用:进行常见的文件操作(拷贝,创建等);特点:单例模式,不需要NEW对象获取;
NSFileManger *fm=[NSFileManger defaultManger];///获取此类对象
功能:
判断文件是否存在.根据路径是否存在.-(BOOL)fileExistsAtPath:路径;
判断文件是否一个目录:fileExistsAtPath:路径 is Director:BOOL
判断文件是否可读:-(BOOL)isReadableFileAtPath: ;
判断是否可写:-(BOOL)isWriteableFileAtPath: ;
文件访问:
获取文件信息:-(NSDictionary*)attributesOfitemAtPath:路径 error:nil
获取指定目录子目录-递归:-(NSArray*)subpathsAtPath:路径;
子目录-非递归:-(NSArray*)subpathsOfDirectorAtPath:// error:nil;
子目录-不包含后代元素:-(NSArray*)contentOfDirectoryAtPath:/ error:nil;
文件操作:
创建:-(BOOL)creatFileAtPath:路径 contents:内容 attributes:属性;(内容:NSData类型)
creatDirectoryAtPath:路径 withIntermediateDirctories:YES/NO (YES表示创建过程目录,NO即不自动创建) attributes:属性信息 error:错误信息对象
拷贝文件:-(BOOL)copyItemAtPath:源文件路径 toPath:新 error:错误信息对象
移动文件:-(BOOL)moveItemAtPath: topath: error:
删除文件:-(BOOL)removeItemPath: error:
2.沙盒
1.文件下载思路:客户端发送请求->服务器响应,返回NSData->客户端接受数据;
2.沙盒机制(sandbox):每个iOS应用都有自己的应用沙盒,即文件系统目录.属于封闭式的,所有APP都在单独的沙盒中运行;为了:1⃣️完美的用户体验需要对跨应用程序进行整合统一;2⃣️封闭跨应用可以保证系统的安全性;(iOS8以后开放了几个固定的系统区域,例如第三方图片编辑,第三方输入法等)
应用沙盒一般包括:
Documents:保存应用运行时生成需要的持久化数据iTunes会备份.
tmp:临时数据.应用完毕会删除.
library/Cache:缓存文件,不备份不自动删除.
Library/Preferences:保存应用偏好设置.会备份.
3.获取沙盒路径:
获取根路径:NSHomeDirectory()的返回值;
获取tmp路径:NStempoaryDirectory();
获取Documents路径:常用方式—使用字符串拼接=>根目录+Documents;还记得么stringByAppendingPathComponent:@”Documents”
非常用方式:搜索模式=>-(NSArray)NSSearchPathForDirectors(目录1,目录2….,YES)之后获取返回数组的最后一个元素即事所求路径;
3.OC中常见结构体:
NSRange范围,NSPoint/CG二维坐标,NSSize/CGSize 大小,NSRect/CGRect 二维矩形区域.NSPoint和CGPoint同义,前者是后者别名;
此类结构体有专门的打印NSLog方式:
NSLog(@"%@"NSStringFromPoint( ));//Point换
新增快速赋值方式:NSPoint=NSMakePoint(x,y);/CGPoint=CGPointMake(x,y) //其他结构体赋值方式类似
CGPoint结构体成员表示点.double的(x,y)
CGSize成员表示长和宽,double型
CGRect成员为CGPoint和CGSize
NSRange前面说过,成员表示位置和长度;
4.NSNumber类
由于NSArray和NSDictionary等集合只能存放对象,不能存基本数据类型.所以OC中构建了NSNumber类来包装基本类型成对象;作用:封装.
+(NSNumber*)numberWithInt: ; //int可换成其他基本类型保留字
此方法简写:@常量/@(变量)
例:NSSArray *arr=@[对象1,对象2,
@(a),@15];
取回用 -(int)intValue等方法即可
5.NSValue
NSNumber的父类,用于指针.结构体的对象包装.1⃣️,结构体包装:常用:
+(NSValue*)valueWithPoint:(NSPoint)point +....size +...rect 取回-(NSPoint)pointValue: ; ...
对于自定义结构体:
+(NSValue*)valueWithBytes:结构体指针(地址) objCType:@encode(类型描述符)
6.NSDate时间
常用方法:获取当前时间:[NSDate date];
格式化时间():stringFromDate
计算时间:+(instancetype)dateWithTimeIntervalSinceNow: ;
NSCalendar日历处理类结合:
NSCalendar * cal=[NSCalendar currentCalendar]; [cal components:要获取的内容 fromDate:从哪个时间对象]
7.集合对象的内存管理
**add一个对象到集合中,那么该对象的引用计数器+1;当集合被销毁时,会向集合中元素发送release消息;
创建集合时方法里调用了//autorelease方法释放池结束…**
8. copy/MUtableCopy
目的:copy某个对象数据,使在修改时互不影响.前提:自定义对象所属类必须遵守NSCopying协议.才能copy;使用时系统会默认调用此协议的方法copyWithZone;
@protocol NSCopying -(id)copyWithZone:(NSZong*)zone; @end 实现: -(id)copyWithZone:(NSZong*)zone{ //1.产生新对象 Person *p=[Person new]; //2.把源对象中的属性值都拷贝到新对象中 p.name=self.name; //3.返回新对象 return p; } //使用MUtablecopy时协议和方法名称换一下即可(zone是以前为了防止堆区内存碎片,现在不用管了)
两种方式:
copy和mutableCopy;
不论源对象是否为可变对象
源对象-copy-不可变副本对象
源对象-mutableCopy-可变副本对象;
而只有源对象和副本对象都不可变时,为浅复制,其余都是深复制
浅复制:也称指针拷贝,此时实际没有产生新对象,源对象和副本对象为同一个,此时引用计数器+1,相当于一次retain操作
深复制:值拷贝,创建了新对象,源对象计数器不变,副本对象引用计数器由于是新产生的对象为1.
对于@property的内存管理策略:
MAR下:
copy:只用于NSString和block和满足NSCopying协议的自定义类.
retain:除了上述之外所有对象
assign:基本数据类型,特例的当两个对象出现循环引用时一端用retain,一端用assign
—-
ARC下:
copy:相同 //copy NSString成不可变-为了不让外部意外改变值,//block是为了copy到堆区,不让提前释放.
strong:同retain ,如果对象释放,需要手动指向nil.(weak的话不需要,指针自动指向nil)
weak:当两个对象循环引用时一段strong,一端strong. (如delegate)
assign:相同
单例
作用:在开发中用于多个界面传值; 只创建一个对象,节省内存.概念:单例模式的意图是类的对象成为系统中唯一的实例,提供一个访问点,共享;
使用场景:
类只能有一个实例,而且必须从一个为人熟知的访问点对其惊喜访问,比如:工厂方法;
这个唯一实例只能通过子类话进行扩展,而且扩展的对象不会破坏客户端代码.
特点:
某个类只能有一个实例
他必须自行创建这个对象
必须自行向整个系统提供这个实例
为了保证实例的唯一性,我们必须将….方法进行覆盖;
需要覆盖的方法:
-(id)copyWithZone:(NSZone*)zone{ return self; } +(id)allocWithZone:(NSZone*)zone{ //线程保护 @synchronized(self) { if (instances == nil) { //调用父类的alloc instances = [super allocWithZone:zone]; return instances; } } return instances; } -(id)retain{ return self; } -(NSUInteger)retainCount{ return NSUIntegerMax; } -(oneway void)release{ } -(id)autorelease{ return self; }
另外新定义一个类方法作为共享访问点:
先在.m中定义一个静态的对象类型的全局变量.并nil//静态区,程序结束释放. static SingletonClass *instaces=nil; +(instrancesType)shareXxxx{ if(instaces==nil){ instances=[self allocWithZone:null]; return instances; }//判断对象是否存在,如果不存在创建新对象. return instances; //如果已经存在,什么都不做,直接返回对象
9. NSSet 和 NSArray
5.1 NSSet介绍:1> 无序的、不重复的。存放到 NSSet 中的内容并不会排序与添加顺序也没有关系
2> 通过 anyObject 来访问单个元素
3> 遍历 NSSet 中的每个元素。通过forin循环来遍历
4> 好处: 效率高。
5> 应用场景:
- 比如重用 Cell 的时候, 从缓存池中随便获取一个就可以了, 无需按照指定顺序来获取
- 需要把数据存放到一个集合中, 然后判断集合中是否有某个对象的时候
5.2 NSArray介绍:
1> 有序的、可以有重复对象。对象的顺序是按照添加的顺序来保存的
2> 通过下标来访问
3> 好处: 有序访问
4> 应用场景: 在绝大多数需要依赖顺序的情况下(比如 tableView 的数据源集合,在实际操作中要根据下标来获取对象)
相关文章推荐
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS教程:对象-正则表达式(RegExp)对象
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- C#编程自学之类和对象
- C++中对象的常引用、动态建立和释放相关知识讲解
- php中将一个对象保存到Session中的方法
- php对象和数组相互转换的方法
- PHP中把对象转换为关联数组代码分享
- C#写入对象或集合类型数据到xml文件的方法
- C#利用反射来判断对象是否包含某个属性的实现方法
- ASP.NET中使用Application对象实现简单在线人数统计功能
- asp提示Server 对象 错误 ASP 0178 : 80070005
- Javascript 对象的解释
- JavaScript对象、属性、事件手册集合方便查询