您的位置:首页 > 运维架构

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 的数据源集合,在实际操作中要根据下标来获取对象)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象