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

技术标签: ios学习历程  

——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 *laterDate = [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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27239329/article/details/50208025

智能推荐

Android studio如何导入Eclispe项目以及Eclispe如何导入Android项目_eclispe和android studio文件之间怎么转化-程序员宅基地

文章浏览阅读2.1k次。Android studio如何导入Eclispe项目直接导入,选择 Import project (Eclipse ADT, Gradle, etc.) 一路next就可以了。Eclispe如何导入Android studio项目不能直接导入,手工改。(以下Android studio简称 as)在eclipse 上新建一个空的项目;点击 android studio 中的android 视_eclispe和android studio文件之间怎么转化

android 设置TextView水平滚动和解决首行缩进问题_手机浏览器内文章段落首行不缩进-程序员宅基地

文章浏览阅读68次。android 设置TextView水平滚动和解决首行缩进问题_手机浏览器内文章段落首行不缩进

MySQL基础之表的管理-程序员宅基地

文章浏览阅读119次。添加和删除字段操作添加字段alter table tbl_name add 字段名称 字段属性 [完整性约束条件] [first|after 字段名称之后];删除字段alter table tbl_name drop 字段名称;测试create table if not exists user1( id int unsigned auto_increment key);--..._mysql基础之表的管理

栅格数据赋值编程C语言,使用Rasterio读取栅格数据的实例讲解-程序员宅基地

文章浏览阅读458次。Rasterio简介有没有觉得用GDAL的Python绑定书写的代码很不Pythonic,强迫症的你可能有些忍受不了。不过,没关系,MapBox旗下的开源库Rasterio帮我们解决了这个痛点。Rasterio是基于GDAL库二次封装的更加符合Python风格的主要用于空间栅格数据处理的Python库。Rasterio中栅格数据模型基本和GDAL类似,需要注意的是:在Rasterio 1.0以后,..._c语言栅格数据读取与基本操作

如何用python画一条蟒蛇_Python之绘制蟒蛇-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏6次。1、turtle库是python常用的绘制图像的库,根据一组函数的指令决定轨迹图形。2、def用于定义函数,def所定义的函数在程序中未经调用不能直接执行,需要通过函数名调用才能执行。3、turtle.setup(宽度,高度,左上角横坐标,左上角纵坐标)——这个函数用于创建一个图形窗口。4、turtle.pensize(size)——表示运行轨迹的宽度,size单位为像素。5、turtle.pen..._python蟒蛇绘制中rad,angle,len,neckrad

XML解析_<?xml version="1.1"?>-程序员宅基地

文章浏览阅读456次。1. XML总结1.1. XML简介XML : 可扩展的标记语言。(和HTML非常类似的) - 可扩展的。 - 自定义的标签。与HTML区别: XML传输数据,HTML是显示数据。XML的版本: XML1.0(几乎都使用该版本) XML1.1(不向下兼容)做什么用?=>描述有关系的数据应用 1. 作为配置文件。 2. 可以在系统与系统之间进行数据的传输。 * webserivice_

随便推点

C语言中字符串用strcmp和==比较的问题_字符串可以用==比较吗-程序员宅基地

文章浏览阅读6.1k次,点赞8次,收藏47次。文章目录导论正文strcmp()函数实例1.字符串比较2.字符串变量比较3.字符串数组比较结论导论在判断两个字符串的内容是否相等的时候,如果使用==,当两个字符串不是指向内存中同一地址时,那么即使这两个字符串内容一样,但是用==比较出来的结果也是 false。所以两个字符串在比较内容是否相等的时候一定要使用strcmp()。正文strcmp()函数为了便于大家的阅读和理解,在这里先简单的介绍下strcmp()函数使用格式:#include<string.h>int strcmp_字符串可以用==比较吗

R语言文本特征工程:词袋模型-程序员宅基地

文章浏览阅读1.4k次。作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。邮箱:huang.tian-yuan..._词袋法 文本相似度 r语言

android后台进程常驻,android 后台常驻,不会被kill-程序员宅基地

文章浏览阅读2.5k次。第一步:import android.app.Notification;import android.app.PendingIntent;import android.app.Service;import android.content.Context;import android.content.Intent;import android.media.MediaPlayer;import and..._安卓应用常驻通知 后是不是不会被杀死

贝叶斯线性回归文章汇总_贝叶斯回归分析和偏最小二乘回归分析-程序员宅基地

文章浏览阅读2.3k次。一、常规线性回归及其求解方法核心提炼1、普通最小二乘法(OLS)的解析解可以用 Gaussian 分布以及极大似然估计解释;2、Ridge 回归可以用 Gaussian 分布和最大后验估计解释 ;3、LASSO 回归可以用 Laplace 分布和最大后验估计解释。二、贝叶斯线性回归定义贝叶斯线性回归(Bayesian linear r..._贝叶斯回归分析和偏最小二乘回归分析

C数据结构:树和森林存储方式与遍历方式_c语言输入并存储一个森林-程序员宅基地

文章浏览阅读1.4k次,点赞5次,收藏15次。树的定义:只有一个根节点,但是分支可以没有规律,也就是说不像二叉树那样每个结点最多生出两个分支。而且树和接下去学习的图都有一个共同的特点就是套娃,无限套娃。树的存储结构方式都会用到数组顺序存储结构,数组是核心,数组结合链式的也有。至于为什么树要用到数组比较多,我认为是数组有一个很好的点就是他的位置可以很容易且快速的找到并访问,但是链式就不具有该优点,因为链式是一条绳子上的蚂蚱,必须一个一个的找。很显然就像名字说的那样,用该结点的双亲结点位置来表示当前的结点。双亲表示法就比如:让孩子记住自己父母的电话一_c语言输入并存储一个森林

位运算符——&0xFF的运算与讲解_代码对&0xff-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏51次。区分 &,丨,^的运算规则 & (按位与运算符)表示:两个操作数中位都为1,结果为1如果两个操作中位一个1另一个0 ,结果为0即运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;例如:1010 & 1110= 1010|(按位或运算符)表示:两个操作中位只有一个为1,结果就等与1即运算规则:0|0=0; ..._代码对&0xff

推荐文章

热门文章

相关标签