OC中NSFileManager类 和 copy一些用法

一:NSFileManager的使用

1, 概念:用来管理文件系统,它可以用来进行常见的文件\文件夹的操作(拷贝、剪切、创建等)

NSFileManager 使用了单例模式singleton

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

2,

1>常见判断

        //1,判断文件或文件夹是否存放
//        NSFileManager *fileManager = [NSFileManager defaultManager];
//        NSString *path = @"/Users/ll/Desktop/ll";
//        BOOL b = [fileManager fileExistsAtPath:path];
//        NSLog(@"%d", b);

        // 2,判断文件或文件夹是否存放,可以指定文件或文件夹
//        BOOL b = [fileManager fileExistsAtPath:path isDirectory:NO];
//        NSLog(@"%d", b);

        // 3,判断文件或者文件夹是否可读写、可删除
//        BOOL b = [fileManager isWritableFileAtPath:path];
//        BOOL c = [fileManager isReadableFileAtPath:path];
//        BOOL d = [fileManager isDeletableFileAtPath:path];
//        NSLog(@"%d", d);
//        NSLog(@"%d--%d", b, c);
        

2>判断文件的访问

        // 1,获得文件或者文件夹的属性
//        NSFileManager *fileManager = [NSFileManager defaultManager];
//        NSString *path = @"/Users/ll/Desktop/ll.txt";
//        NSDictionary *dic = [fileManager attributesOfItemAtPath:path error:nil];
//        NSLog(@"%@", dic);
//        // 获得单独属性值
//        NSLog(@"%@", dic[NSFileSize]);

        // 2 获得path的所有?子路径(后代路径),下面两个?方法功能?一样
//        NSArray *arr = [fileManager subpathsAtPath:path];
//        NSArray *arr = [fileManager subpathsOfDirectoryAtPath:path error:nil];
//        NSLog(@"%@", arr);

        // 3获得path的当前?子路径(path下的所有(直接?子内容),path必须是?一个??目录
//        NSArray *arr = [fileManager contentsOfDirectoryAtPath:path error:nil];
//        NSLog(@"%@", arr);

        // 4获得文件内容
        // 注意通过fileManager获得文件中的内容为二进制数需要转换
//        NSData *data = [fileManager contentsAtPath:path];
//        NSLog(@"%@", data);

        // 5,将字符串转换成NSData
//        NSString *string = @"nihao, 中国";
//        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//        [fileManager createFileAtPath:path contents:data attributes:nil];
        

3>NSFileManager的文件操作

*  NSFileManager的文件操作
         • -(BOOL)copyItemAtPath:(NSString*)srcPathtoPath:(NSString *)dstPath error:(NSError **)error;
         ? 拷?
         • -(BOOL)moveItemAtPath:(NSString*)srcPathtoPath:(NSString
         *)dstPath error:(NSError **)error; ? 移动(剪切)
         • -(BOOL)removeItemAtPath:(NSString*)patherror:(NSError **)error;
         ? 删除

二:copy

1,概念:copy意思就是拷贝,产生一个副本的过程

目的:多个地方同时使用同一个对象时,为了在某个地方修改了该对象不影响其他使用者,可以对该对象拷贝一个副本,

特点:就是修改源文件内容,不会影响副本文件;修改副本文件也不会影响源文件

2,OC中可以调用copy 或者mutable copy方法来创建一个副本

使用copy或者mutable copy的前提:

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

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

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

@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;

@end

3规则

1> [对象 copy];  // 调用copy方法,最终产生的就是一个不可变对象。

2> [对象 mutableCopy];  // 调用mutableCopy方法,最终产生的就是一个可变对象。

3> 只有当不可变对象调用copy方法(得到的也是一个不可变对象)的时候,两个变量会指向同一个对象。其他情况下都是创建了一个新的对象(对象地址是不一样的)。

当拷贝完毕以后,如果两个对象的地址是一样的叫做“浅复制”(浅拷贝)

当拷贝完毕后,确实创建了一个新对象,这种情况下的拷贝,叫做“深复制”(深拷贝)

4规范

当使用@property的时候,遇到字符串类型的时候,建议使用copy关键字来修饰。

**注意:在MRC下,一般OC对象都使用retain,在ARC下,一般OC对象都是用strong

在MRC下,一般NSString都使用copy,在ARC下,一般NSString都是用copy

@property使用copy关键字修饰,表示生成的内存管理代码,中使用的时copy关键字。

为什么对于字符串类型,编写@property的时候要使用copy关键字?

答:防止外部的字符串发生变化后,互相影响。

代码示例:

@interface LLPerson : NSObject
@property (nonatomic, strong) NSString *name;
@end
@implementation LLPerson

@end

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

    @autoreleasepool {

        LLPerson *person  = [[LLPerson alloc] init];
        NSMutableString *string = [NSMutableString string];
        [string appendString:@"sxs"];
        person.name = string;

        [string insertString:@"s" atIndex:0];

        NSLog(@"%@", person.name);
    }
    return 0;
}

@property用strong修饰的话打印结果会改变,如果换成copy结果就不好改变,这也是copy的目的

注意:当不可变类型 调用copy方法(得到一个不可变类型)的时候,因为两个都是不可变类型,所以谁都不可能去修改源对象,所以这时无需担心,其中一个对象修改了影响另外一个对象,所以Apple帮我们做了优化,copy完毕以后,并没有创建新对象。

时间: 2024-12-21 21:44:01

OC中NSFileManager类 和 copy一些用法的相关文章

OC中协议, 类目, 时间, 延展, 属性

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @property (nonatomic, assign) id<marryprotocol> husband; 避免Optitonal没有实现的功能 if ([_husband respondsToSelector:@selector(driver)]) { [_husband driver]; } @required//必须实现的协议, 默认协议 - (void)s

CSS中伪类及伪元素用法详解

原文:CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的读者可以自己尝试: :active  大致效果为用鼠标点击时,元素增加特效,鼠标松开时,特效消失.多用在按钮的点击上. 写法: 这里id为box的是一div块,在css中首先设置了他的基本样式,下面为加入:active伪类后需要修改的样式. 未点击时: 点击之后: :active.:hover.:

Runtime of Objective-C 2-理解oc中的类和对象

1: 类Class:       typedef struct objc_class * Class;     从Class的定义可以看出,它是一个 objc_class 结构类型的指针,objc_class又是什么呢? struct objc_class { struct objc_class* isa; struct objc_class* super_class; //root的为null const char* name; long version; long info; long in

OC中的类簇的使用和初始化方法中属性的使用

今天遇到了几个和字符串相关的内存问题,和大家分享一下 NSString *name = [[NSString alloc]initWithString:@"张三"];NSLog(@"%d",[name retainCount]); 这两行代码的打印结果是-1, NSString * aString = [[NSString alloc] initWithFormat:@"123"]; NSLog(@"%d",aString.r

OC中的类

OC是一门面向对象的语言,其中自然少不了类.对应C++中的声明和定义,OC的类也分为interface和implementation,并分别以指令 @interface ... @end @implementation ... @end 表述.一般我们会把interface部分放置在.h文件中,而实现部分,则放置在.m文件中. 下面是类Fraction的实例, Fraction.h头文件: #import <Foundation/Foundation.h> @interface Fractio

OC中数组类NSArray的详解(二)

数组类的便利 1.for循环(大家都会的...) 2.NSEmunerator 3.for in 首先重点说下 第二种NSEmunerator枚举器,系统声明是 1 @interface NSEnumerator : NSObject <NSFastEnumeration> 2 3 - (id)nextObject; 4 5 @end 6 7 @interface NSEnumerator (NSExtendedEnumerator) 8 9 @property (readonly, copy

黑马程序员 oc中的类与对象

类就好像一张图纸,而对象就是通过这个图纸创造出来的实物,一个类可以创造出多个对象,对象之间可以是不同的,根据成员变量值的不同即属性不同,对象也就 会不同,做出的行为状态也不同,例如一个车类,它的属性有speed,wheels等,根据speed值的不同可以区分对象,做出跑的状态不同,有的 speed是250km/h,有的speed是300km/h.     在oc中类的设计和对象的创建// 只要import Foundation.h就能使用Foundation框架里的所有头文件#import  <

.NET中Path类的一些常见用法

.NET为处理文件路径提供了一个Path类,利用该类可以方便的处理文件路径,如更改文件后缀,合并文件路径,改变文件的扩展名等.有一点需要注意的是,Path类本质上是对一个字符串进行处理,更改的只是该字符串,而不会影响实际的文件.下面是该类的一些常见用法示例: 1 string filePath = @"C:\D\log\Receive\postedFile.txt"; 2 int padSpacesLength = 30; 3 string newFilePath = string.E

Android中Cursor类的概念和用法

每天学习大量的东西,好多东西都不知道,只好百度.将自己的博客打造成一个文件库 原文链接:http://www.2cto.com/kf/201109/103163.html 关于 Cursor 在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情: Cursor 是每行的集合.使用 moveToFirst() 定位第一行.你必须知道每一列的名称.你必须知道每一列的数据类型.Cursor 是一个随机的数据源.所有的数据都是通过下标取得.关于 Cursor 的