您的位置:首页 > 职场人生

黑马程序员—— OC加强---对象的拷贝

2015-12-07 16:57 513 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

第一讲 NSFileManager介绍和用法

什么是NSFileManager ?

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

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

NSFileManager使用了单例模式singleton,

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

[NSFileManagerdefaultManager]

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

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

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

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

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

(BOOL)isReadableFileAtPath:(NSString *)path;

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

(BOOL)isWritableFileAtPath:(NSString *)path;

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

(BOOL)isDeletableFileAtPath:(NSString *)path;

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

<span "font-size:14px;">#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
@autoreleasepool {

//NSFileManager 用于判断

NSString *filePath = @"/Users/zhaoxiaohu/Desktop/arr.plist";

NSString *filePath2 = @"/";

// 1) 判断文件是否存在
//创建文件管理对象
//调用defaultManager 创建一个文件管理的单例对象
//单例对象:在程序运行期间,只有一个对象存在
NSFileManager *fm = [NSFileManager defaultManager];
// YES 存在   NO 不存在
BOOL isYES = [fm fileExistsAtPath:filePath];
NSLog(@"-->%d",isYES);

if(isYES){
BOOL isDir;

// 2) 判断是否是一个目录
[fm fileExistsAtPath:filePath isDirectory:&isDir];

if (isDir) {
NSLog(@"这是一个目录");
}else{

NSLog(@"这不是一个目录");
}

}

// 3) 判断文件是否可读

isYES = [fm isReadableFileAtPath:filePath];

// 4) 是否可写
isYES = [fm isWritableFileAtPath:filePath2];

// 5) 是否可删除
isYES = [fm isDeletableFileAtPath:filePath2];

NSLog(@"-->%d",isYES);
}
return 0;
}</span>


第二讲 文件下载的思路

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

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

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

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

第三讲 ios沙盒机制

1、iOS沙盒机制

iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。

1.1、每个应用程序都有自己的存储空间

1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容

1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。

2、打开模拟器沙盒目录

下面看看模拟器的沙盒文件夹在mac电脑上的什么位置。

文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library。

2.1 方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名

显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true

隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false

输完单击Enter键,退出终端,重新启动Finder就可以了

重启Finder:鼠标单击窗口左上角的苹果标志–>强制退出–>Finder–>

现在能看到资源库文件夹了。

打开资源库后找到/Application Support/iPhone Simulator/文件夹。这里面就是模拟器的各个程序的沙盒目录了。

2.2 方法2、这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/ 前往。

username这里写你的用户名。

3、目录结构

默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件

Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录

Library:存储程序的默认设置或其它状态信息;

Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。

iPhone在重启时,会丢弃所有的tmp文件。

我们创建一个IosSandbox的项目来展开沙盒和文件读写等操作的练习。

创建后找到模拟器上对应的目录,

这是目录全展开了。

第四讲 NSNumber,NSValue,NSDate的介绍和使用

NSValue的使用:

// 创建NSValue对象

NSValue *value = [NSValue valueWithSize:NSMakeSize(12, 34)];

// 创建可变数组对象

NSMutableArray *array = [NSMutableArray array];

// 把NSValue添加到数组中

[array addObject:value1];

// 从数组中取出值来

NSValue *v = [array lastObject];

// 把NSSize从NSValue中解出来

NSSize size = [v sizeValue];

// 打印信息

NSLog(@”x = %d, y = %d”, size.width, size.height);

// 存放自己写的结构体

typedef struct {

int year;

int month;

int day;

}Data;

Data data = {2013, 08, 3};

// 创建NSValue对象并存入自定义的结构体

NSValue *value = [NSValue value:&data withObjCType:@encode(Data)];

// 取出放入的结构体(取出的时候没有返回值,使用指针变量得到结果)

Data d;

// [value1 getValue:<#(void )#>]; void 代表任何指针

[value getValue:&d];

NSNumber的使用:

// NSNumber的创建和添加元素、可以存入int、double、float、BOOL、char等等类型

NSNumber *number = [NSNumber numberWithInt:432];

// 把值取出

int i = [num intValue];

// double d = [num doubleValue];

// float f = [num floatValue;

// 。。。。。。。

NSDate的使用:

// 创建NSDate对象

NSDate *date = [NSDate date];

// 在当前的时间增加3秒
// Interval就是秒,其实就是一个double类型
date = [NSDate dateWithTimeIntervalSinceNow:3];

// 从1970年。。。增加43秒
date = [NSDate dateWithTimeIntervalSince1970:43];

// 会随机返回一个比较遥远的未来时间
date = [NSDate distantFuture];
// 会随机的返回一个遥远的过去的时间
date = [NSDate distantPast];

// 返回从1970返回的毫秒数
NSTimeInterval interval = [date timeIntervalSince1970];

// 和另一个时间对比
NSDate *date1 = [NSDate date];
[date timeIntervalSinceDate:date1];

// 两个日期的比较
// 相同返回YES,否则返回NO
BOOL b1 = [date isEqualToDate:date1];
// 返回比较早的那个时间
NSDate *earlierDate = [date earlierDate:date1];
// 返回比较晚的那个时间
NSDate *laterD
4000
ate = [date laterDate:date1];

// 日期格式化
// 格式化工具
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
// 格式化的样式
// 代表小时的h大写HH代表24小时制,小写hh代表12小时制
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 设置时区
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
// 格式化哪个日期
NSString *strDate = [formatter stringFromDate:date];
// 把字符串转换日期格式
NSDate *dateStr = [formatter dateFromString:@"2013-12-56 22:34:34"];


第五讲 集合对象的内存管理

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

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

NSMutableArray *arr = [[NSMutableArray alloc] init];

Person *p = [[Person alloc] init];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr addObject:p];
NSLog(@"retainCount = %lu", [p retainCount]);
[p release];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr release];


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

当把一个对象从集合中移除时,会向移除的元素发送release消息

NSMutableArray *arr = [[NSMutableArray alloc] init];
Person *p = [[Person alloc] init];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr addObject:p];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr removeObject:p];
NSLog(@"retainCount = %lu", [p retainCount]);
[p release];
[arr release];


1.官方内存管理原则

1> 当调用alloc、new、copy(mutableCopy)方法产生一个新对象的时候,就必须在最后调用一次release或者autorelease

2> 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease

2.集合的内存管理细节

1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1

2> 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1

3> 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1

3.普遍规律

1> 如果方法名是add\insert开头,那么被添加的对象,计数器会+1

2> 如果方法名是remove\delete开头,那么被移除的对象,计数器-1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: