• 问题总会出现,不过解决问题的方法也会出现!!!

OC加强学习笔记05

学习笔记 小雨 637次浏览 已收录 0个评论

—— ——-

2-NSFileManager介绍和用法

1、NSFileManager介绍

什么是NSFileManager?

顾名思义,NSFileManager是用来管理文件系统的

它可以用来进行常见的文件文件夹操作(拷贝、剪切、创建等)

NSFileManager使用了单例模式singleton

使用defaultManager方法可以获得那个单例对象

[NSFileManager defaultManager]

2、NSFileManager基本(常见的判断)

-(BOOL)fileExistsAtPath:(NSString *)path;

path这个文件或文件夹(目录)是否存在

OC加强学习笔记05

-(BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;

path这个文件或文件夹是否存在,isDirectory代表是否为文件夹

OC加强学习笔记05

-(BOOL)isReadableFileAtPath:(NSString *)path;

path这个文件或文件夹是否可读

OC加强学习笔记05

-(BOOL)isWriteableFileAtPath:(NSString *)path;

path这个文件或文件夹是否可写

OC加强学习笔记05

可写入的目录

OC加强学习笔记05

-(BOOL)isDeletableFileAtPath:(NSString *)path;

path这个文件或文件夹是否可删除

OC加强学习笔记05

系统目录不允许删除

OC加强学习笔记05

3-NSFileManager用法深入(一)

1、NSFileManager文件访问

-(NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;

获得path这个文件文件夹的属性

OC加强学习笔记05

-(NSArray *)subpathsAtPath:(NSString *)path;

查找给定路径下的所有子路径,返回一个数组,深度查找,不限当前层,也会查找package的内容。

OC加强学习笔记05

-(NSArray *)subpathsOfDirectotyAtPath:(NSString *)error:(NSError **)error;

获得path的所有子路径(后代路径),上面两个方法功能一样。

-(NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;

获得path的当前子路径(path下的所有直接子内容,path必须是一个目录)

OC加强学习笔记05

OC加强学习笔记05

-(NSData *)contentsAtPath:(NSString *)path;

获得文件内容

4-NSFileManager用法深入(二)

1、NSFileManager文件操作

-(BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)

createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;

只能创建文件夹(createIntermediates为YES代表自动创建中间的文件夹)

注意如果要创建的目录已经存在,则本次创建失败

OC加强学习笔记05

OC加强学习笔记05

OC加强学习笔记05

-(BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;

拷贝,如果目标目录已经存在同名文件,则无法拷贝

OC加强学习笔记05

-(BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;

移动(剪切)

OC加强学习笔记05

OC加强学习笔记05

-(BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;

删除

OC加强学习笔记05

OC加强学习笔记05

-(BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data

attributes:(NSDictionary *)attr;

创建文件

(NSData是用来存储二进制字节数据的)

//把字符串转换为NSData

NSString *s1 = @”hello”;

NSData *data = [s1 dataUsingEncodeing:NSUTF8StringEncoding];

5-文件下载思路

1、NSFileManager文件下载思路

OC加强学习笔记05

1.发送请求给服务器,要求下载某个文件

2.服务器发出响应,放回文件数据

3.手机客户端利用NSData来存放服务器返回的文件数据

4.利用NSFileManager将NSData里面的文件数据写到新的文件中.(createFileAtPath)

OC加强学习笔记05

6-iOS沙盒(sandbox)机制

1、iOS沙盒(sandbox)机制及获取沙盒路径

(1)沙盒的基本概念和作用

每个iOS应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,iOS系统不允许访问其他应用的应用沙盒。iOS8中已经开放访问(extension)。

扩展阅读:

extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应间通信的限制。

extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的快捷方式,比如用户可以在Today的widgets中查看应用展示的简略信息,而不用再进到我们的应用中,这将是一种全新的用户体验,但是,extension的出现可能会减少用户启动应用的次数,同时还会增大开发者的工作量。

应用沙盒一般包括以下几个文件目录:应用程序包、Documents、Libaray(下面Caches和Preference目录)、tmp

应用程序包:包含所有的资源文件和可执行文件。

Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时间会包括此目录。

tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也有可能会消除该目录下的文件,iTunes不会同步该目录。iphone重启时,该目录下的文件会丢失。

Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。

Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除,一般存放体积比较大,不是特别重要的资源。

Libaray/Preferences:保存应用的所有偏好设置,iOS的Setting(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。

(2)沙盒的位置

(a)Xcode5中模拟器路径为:/Users/用户名/Library/Application Support/iPhone Simulator

OC加强学习笔记05

(b)Xcode6中模拟器路径为:/Users/用户名/Library/Developer/CoreSimulator

OC加强学习笔记05

下面大家看看我的app沙盒找法

OC加强学习笔记05

OC加强学习笔记05

其中Devices文件夹下的16个文件对应Xcode6的16个模拟器,可以根据各个文件夹下的device.plist

文件得到具体的哪个模拟器:

OC加强学习笔记05

(3)获取沙盒路径

获取沙盒目录的方法,有以下几种:

NSString *homeDirectory = NSHomeDirectory();

获取绝对 路径的方法

NSSearchPathForDirectoriesInDomains返回一个绝对路径用来存放我们需要存储的文件

第一个参数:要获取的沙盒文件夹名称

第二个参数:

NSUserDomainMask = 1,//用户主目录中

NSLocalDomainMask = 2,//当前机器中

NSNetworkDomainMask = 4,//网络中可见的主机

NSSystemDomainMask = 8,//系统目录,不可修改(/System)

NSAllDomainMask = 0x0ffff,//全部

第三个参数:YES/NO 是否获取全路径

OC加强学习笔记05

//Document目录

NSArray *paths = NSSearchPathForDirectoriesIndoMains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString *path = [paths objectArIndex:0];

//Cache目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);

NSString *path = [paths objectAtIndex:0];

//Libaray目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);

NSString *path = [paths objectAtIndex:0];

//tmp目录

NSString *tmpDir = NSTemporaryDirectory();

常见用法:

在沙盒文件中创建文件夹

如:在Document目录下创建新的文件夹test

OC加强学习笔记05

7-常见的结构体

1、NSPoint和CGPoint的使用

CGPoint和NSPoint是同义的

typedef CGPoint NSPoint;

CGPoint的定义

struct CGPoint{

CGFloat x;

CGFloat y;

};

typedef struct CGPoint CGPoint;

typedef double CGFloat;//64位是double,32位是float

CGPoint代表的是二维平面中的一个点

可以使用CGPointMake和NSMakePoint函数创建CGPoint

2、NSSize和CGSize的使用

CGSize和NSSize是同义的

typedef CGSize NSSize;

CGSzie的定义

struct CGSize{

CGFloat width;

CGFloat height;

};

         typedef struct CGSize CGSize;

CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)

可以使用CGSizeMake和NSMakeSize函数创建CGSize

3、NSRect和CGRect的使用

CGRect和NSRect是同义的

typedef CGRect NSRect;

CGRect的定义

struct{

CGPoint origin;

CGSize size;

};

typedef struct CGRect CGRect;

CGRect代表的是二维平面中的某个物体的位置和尺寸

可以使用CGRectMake和NSMakeRect函数的创建CGRect

4、常见的结构体使用注意

苹果官方推荐使用CG开头的:

CGPoint

CGSize

CGRect

8-NSNumber的使用

1、NSNumber的介绍和作用

NSArrayNSDictionary中只能存放OC对象,不能存放intfloatdouble等基本数据类,如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象。

OC加强学习笔记05

NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArrayNSDictionary中

OC加强学习笔记05

2、NSNumber的创建

以前的写法

+(NSNumber *)numberWithInt:(int)value;

+(NSNumber *)numberWithDouble:(double)value;

+(NSNumber *)numberWithBool:(BOOL)value;

OC加强学习笔记05

现在的写法

@10;

@10.5;

@YES;

@(num);//如果是变量必须加()

@这种写法,只能包含数字,返回值就是NSNumber *类型。

OC加强学习笔记05

2、从NSNumber对象中的到基本类型数据

-(char)charValue;

-(int)intValue;

-(long)longValue;

-(double)doubleValue;

-(BOOL)boolValue;

-(NSString *)stringValue;

-(NSComparisonResult)compare:(NSNumber *)otherNumber;

-(BOOL)isEqualToNumber:(NSNumber *)number;

OC加强学习笔记05

9-NSValue的介绍和使用

NSNumber是NSValue的子类,NSvalue主要用来把指针,CGRect结构体等包装成OC对象,以便存储。

一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如:int,float,char,当然也可以是指pointers,structures,and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一致是不可枚举的。

为了方便结构体和NSValue的转换Foundation提供了以下方法:

将结构体包装成NSValue对象- ->存储结构体到集合中

+(NSValue *)valueWithPoint:(NSPoint)point;

+(NSValue *)valueWithSize:(NSSize)size;

+(NSValue *)valueWithRect:(NSRect)rect;

从NSValue对象取出之前包装的结构体

-(NSPoint)pointValue;

-(NSSize)sizeValue;

-(NSRect)rectValue;

不能直接放NSPoint类型的数据在数组中

OC加强学习笔记05

使用

OC加强学习笔记05

1、+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;

创建一个NSValue

value:对象地址

objCtype:通常是一个用来描述对象类型和大小的字符串

C字符串(char *)的表示

2、-(void)getValue:(void *)value(出参);

从接受value消息的对象中

提取数值

提取的数值,存放在这个指针所指向的内存块里。

OC加强学习笔记05

10-NSDate的介绍和使用

1、NSDate的介绍和使用

NSDate可以用来表示时间,可以进行一些常见的日期时间处理

一个NSDate对象就代表一个时间

[NSDate date]返回的就是当前时间

获取当前时区的时间。

OC加强学习笔记05

修改办法:

OC加强学习笔记05

2、格式化日期

NSDate – ->dateString

OC加强学习笔记05

dataString – ->Date

OC加强学习笔记05

3、计算日期

OC加强学习笔记05

4、日期时间对象

OC加强学习笔记05
OC加强学习笔记05

OC加强学习笔记05

OC加强学习笔记05

11-集合对象的内存管理

1、集合对象的内存管理

当一个对象加入到集合中,那么该对象的引用计数会+1

当集合被销毁的时候,集合会向集合中的元素发送release消息

NSArray *arr = @[……]; //会调用autolease方法

OC加强学习笔记05

NSArray *arr2 = [[NSArray alloc]init]; //需要我们手工[arr release];

OC加强学习笔记05

[arr2 release];

OC加强学习笔记05

OC加强学习笔记05

OC加强学习笔记05
OC加强学习笔记05

OC加强学习笔记05

OC加强学习笔记05

autorelease的影响

OC加强学习笔记05

2、集合内存管理总结

OC加强学习笔记05OC加强学习笔记05

12-copy概念及入门

1、对象copy的概念

(1)什么是copy?

Copy的字面意思是“复制”、“拷贝”,是一个生产副本的过程

对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容。

常见的复制有用一个源文件产生:文件复制

作用:利一个副本文件

(2)特点:

修改源文件的内容,不会影响副本文件

修改副本中的内容,不会影响源文件

OC中的copy,就是指的对象的拷贝

作用:利用一个源对象产生一个副本对象

(3)如何使用copy功能

一个对象可以调用copy或mutableCopy方法来创建一个副本对象

copy:创建的是不可变副本(如NSString、NSArray、NSDictionary)

mutableCopy:创建的是可变副本(如NSMutableString、NSmutableArray、NSMutableDictionary)

(4)使用copy功能的前提

copy:需要遵守NSCopying协议,实现copyWithZone:方法

@protocol NSCopying

-(id)copyWithZone:(NSZone *)zone;

@end

mutableCopy:需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法

@protocol  NSMutableCopying

-(id)mutableCopyWithZone:(NSZone *)zone;

@end

2、copy快速入门

以NSString字符串为例,进行copy和mutableCopy演示

copy就是浅赋值,没有产生新的对象(有没有产生新的对象也是判断深浅复制的标准)

此处的copy以后产生还是不可变的字符串
OC加强学习笔记05

OC加强学习笔记05

mutableCopy就是深复制,会在内存中重新分配一块内存空间

OC加强学习笔记05

OC加强学习笔记05

还有一种情况的深拷贝

OC加强学习笔记05

OC加强学习笔记05

13-copy与内存管理

1、copy与内存管理

注意为了确保测试通过,最好创建iOS项目测试

NSString的copy

浅复制,源对象的引用计数器+1OC加强学习笔记05

NSString的mutableCopy

浅复制,创建了一个新对象,新对象的引用计数器是1

OC加强学习笔记05

2、copy与内存管理

深复制(深拷贝、内容拷贝、deep copy)

源对象和副本对象时不同的两个对象

源对象引用计数器不变,副本对象计数器为1(因为新产生的)

本质是:产生了新的对象

浅复制:(浅拷贝,指针拷贝,shallow copy)

源对象和副本对象时同一个对象

源对象(副本对象)引用计数器+1,相当于做一次retain操作

本质是:没有产生新的对象

14-@property中的关键字

1、@property中的copy作用

分析代码:

OC加强学习笔记05

OC加强学习笔记05

这显然不符合我们的要求,因为str修改后,会影响Person.name的值

解决方法:

@property(nonatomic,copy)NSString *name;

set方法展开形式为:

OC加强学习笔记05

2、@property内存管理策略选择

@property内存管理策略的选择

1.非ARC

(1)copy:只用于NSStringblock

(2)retain:除NSStringblock以外的OC对象

(3)assign:基本数据类型、枚举、结构体(非OC对象),当两个对象相互引用,一端用retain,一端用assign

2.ARC

(1)copy:只用于NSStringblock

(2)strong:除NSStringblock以外的OC对象

(3)weak:当2个对象相互引用,一端用strong,一端用weak

(4)assign:基本数据类型、枚举、结构体(非OC对象)

15-为自定义的类实现copy操作

1、为自定义的类实现copy操作

自定义对象copy步骤

新建Person类

为Person类实现copy操作

(1)让Person类遵守NSCopying协议

(2)实现copyWithZone:方法,在该方法中返回一个对象的副本即可。

(3)在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致,并返回该对象

创建Person对象,调用copy方法,查看地址

OC加强学习笔记05

OC加强学习笔记05

为Person类实现mutableCopy操作

1.遵守NSMutableCopying协议

2.实现协议对你的方法

OC加强学习笔记05

16-简单地单例模式实现

1、单例模式概念

(1)什么是单例模式:(Singleton)

单例模式的意图是类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源。

(2)什么情况下使用单例?

(a)类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。

(b)这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

(3)单例设计模式的要点:

(a)某个类只能有一个实例

(b)他必须自行创建这个对象

(c)必须自行向整个系统提供这个实例;

(d)为了保证实例的唯一性,我们必须将

-(id)copyWithZone:(NSZone *)zone

+(id)allocWithZone:(NSZone *)zone

-(id)retain

-(oneway void)release

-(id)autorelease

的实现方法进行覆盖。

(e)这个方法必须是静态类

(4)在OC中实现单例模式:

先创建一个单例类,即:

#import<Foundation/Foundation.h>

@interface Bee : NSObject<NSCopying>//注意此处调用了NSCopying协议

+(Bee *)shareIsrance;//此处定义了一个工厂方法,用工厂方法来显示实例化过程(下文中将会提到)

@end//调用NScoping协议,从而在实现文件中覆盖

2、单例模式实现

OC加强学习笔记05

OC加强学习笔记05

OC加强学习笔记05

OC加强学习笔记05


本博客内容既有转载自网络的内容,也有本作者原创内容,仅供学习与交流之用
如有侵权或者错误之处,请及时在下方留言!
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址