------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
NSFileManager 的介绍和用法
NSFileManager 是用来管理文件系统的
它可以用来进行常见的文件\文件夹操作(拷贝\剪切\创建)
NSFileManager 使用了单例模式singleton
使用defaultManager 方法可以获得那个单例对象 [NSFileManager defaultManager ];
<span style="font-size:12px;">#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// NSFileManager 用于判断
NSString *filepath = @"/Users/Y_sir/Desktop/url1.txt";
NSString *filepath1 = @"/Users/Y_sir/Desktop";
// 1)文件是否存在
//单例对象 在程序运行期间 ,是有一个对象存在
NSFileManager *file = [NSFileManager defaultManager];
BOOL exist = [file fileExistsAtPath:filepath];
if (exist) {
NSLog(@"file exist");
}
// 2)文件是否是一个目录
// file fileExistsAtPath:filepath isDictionary:&is
// 3)文件是否可读
exist = [file isReadableFileAtPath:filepath];
NSLog(@"exist = %d",exist);
// 4)文件是否可写
exist = [file isWritableFileAtPath:filepath];
NSLog(@"exist = %d",exist);
// 5)文件是否可删除
exist = [file isDeletableFileAtPath:filepath1];
NSLog(@"exist = %d",exist);
}
return 0;
}</span>
NSFileManager 对文件的操作
<span style="font-size:12px;">#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建目录
NSFileManager *fm = [NSFileManager defaultManager];
//
NSString *createfile = @"/Users/Y_sir/Desktop/NSFileManager/aaaa/cccc";
//
BOOL createbyme = [fm createDirectoryAtPath:createfile withIntermediateDirectories:YES attributes:nil error:nil];
if (createbyme) {
NSLog(@"create file successed !");
}
//创建文件
NSString *str = @"我的去 ,好大风";
NSString *createfile1= @"/Users/Y_sir/Desktop/NSFileManager/aaaa/cccc/yanghong.txt";
// NSData 是一个处理二进制数据的类
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
BOOL aa = [ fm createFileAtPath:createfile1 contents:data attributes:nil];
if (aa) {
NSLog(@"创建成功");
}else{
NSLog(@"创建失败");
}
//copy move 文件
NSString *createfile2 = @"/Users/Y_sir/Desktop/NSFileManager/aaaa/cccc/yanghong.txt";
BOOL bb= [fm copyItemAtPath:createfile2 toPath:createfile1 error:nil];
if (bb) {
NSLog(@"创建成功");
}else{
NSLog(@"创建失败");
}
//栓删除文件
}
return 0;
}</span>
NSNumber 的使用
NSArray NSDictionary 只能存放OC对象,不能存放 int \float \double等基本数据类型,如果需要把基本数据类型放进数组或字典中,需要先把基本数据类型包装成OC对象
NSNumber 的创建和使用
<span style="font-size:12px;">#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// NSNumber 是OC中处理数据类型的一个类
int a=10;
float f = 3.14f;
NSNumber *intobj = [NSNumber numberWithInt:a];
// NSArray *array = [NSArray arrayWithObjects:intobj, nil];
NSMutableArray *array = [NSMutableArray arrayWithObjects:intobj, nil];
NSLog(@"array = %@",array);
NSNumber *floatobj = [NSNumber numberWithInt:f];
[array addObject:floatobj];
NSLog(@"array = %@",array);
// NSNumber *n1 = array[0];
// int a1 =[n1 intValue];
// NSNumber *n2 = array[1];
// float f1 =[n2 floatValue];
// NSLog(@"%.2f",a1 + f1);// [array[0] intValue] + [array[1] floatValue];
int b = [array[0] intValue] + [array[1] floatValue];
NSLog(@"%d",b);
}
return 0;
}</span>
NSValue 的介绍和使用
NSNumber 是NSValue 的子类,NSValue 主要是把指针,CGRect 等结构体包装成OC对象,以便储存。
<span style="font-size:12px;">#import <Foundation/Foundation.h>
void test (){
//创建一个结构体变量
//p1是 CGPoint 类型的结构体变量
CGPoint p1 = CGPointMake(20, 30);
NSRect r1 = NSMakeRect(0, 0, 100, 100);
NSMutableArray *arr = [NSMutableArray array];
NSValue *pvalue = [NSValue valueWithPoint:p1];
[arr addObject:pvalue];
[arr addObject:[NSValue valueWithRect:r1]];
NSLog(@"arr = %@ ",arr);
//取出数组里面的值
NSValue *r1value =[arr lastObject];
NSRect r2 = [r1value rectValue];
NSLog(@"%@",NSStringFromRect(r2));
}
typedef struct Date{
int year;
int month;
}Mydate;
int main(int argc, const char * argv[]) {
@autoreleasepool {
Mydate md = {2015 ,3};
NSValue *value = [NSValue valueWithBytes:&md objCType:@encode(Mydate)];
NSLog(@"%@",value);
Mydate mmd;
[value getValue:&mmd];
NSLog(@"%d ,%d",mmd.year ,mmd.month);
}
return 0;
}</span>
NSDate 的 介绍和使用
NSDate 可以用来表示时间,可以进行一些常见的日期和时间的处理
一个NSDate 对象就代表一个时间
[NSDate date] 返回的就是当前时间
<span style="font-size:12px;">#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 获取当前时间
NSDate *d1 =[NSDate date];
NSLog(@"%@",d1);//格林威治时间
// 格式化时间
// NSDateFormatter 日期格式化
NSDateFormatter *d2 = [NSDateFormatter new];
d2.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *d3 = [d2 stringFromDate:d1];
NSLog(@"%@",d3);
// 计算时间
NSTimeInterval t =60*60*24;
NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:t];
NSString *d4 = [d2 stringFromDate:tomorrow];
NSLog(@"%@",d4);
// 日期时间对象的使用
// NSCalendar 可以快速获取年月日
// NSDate *d5 =[NSDate date];
// NSCalendar *calendar = [NSCalendar currentCalendar];
// NSDateComponents *coms = [calendar component:NSCalendarUnitYear fromDate:d5];
}
return 0;
}
</span>
集合对象的内存管理
当一个对象加入到集合中,那么对象的引用计数 +1
当集合被销毁时,集合会向集合中的元素发送release消息
集合的内存管理细节
1)当一个对象添加到集合中时,这个对象会做一次retain操作,计数器+1
2)当一个被销毁时,会对集合里面的所有对象做一次release操作,计数器-1
3)当一个对象从集合中移除时,这个对象会做一次release操作,计数器-1
普遍规律:
1)如果方法名是add\insert开头,那么被添加的对象,计数器+1
2)如果方法名是remove\delete开头,那么被移除的对象,计数器-1
<span style="font-size:12px;"> //创建对象
Person *p = [Person new]; //1
[p retain]; //2
NSMutableArray *marr = [NSMutableArray array];
[marr addObject:p];
NSLog(@"p.retainCount = %lu",p.retainCount); //3
[p release]; // 2
</span>
copy 概念及入门
对象拷贝的目的: 要使用某个对象的数据,但是在修改对象时不影响原来的对象内容
使用
一个对象可以调用copy或者mutablecopy 方法来创建一个副本对象
copy :创建的是一个不可变副本
mutablecopy :创建的是可变的副本
使用copy功能的前提:
需要遵守NSCopying协议,实现copyWithZone:方法
格式:
@property NSCopying
-(void)copyWithZone:(NSZone *)zone;
@end
使用mutableCopy功能的前提:
需要遵守NSMutabelCopying协议,实现mutableCopyWithZone:方法
格式:
@property NSCopying
-(void)mutableCopyWithZone:(NSZone *)zone;
@end
自定义类实现copy的功能:
1) 创建一个类
2) 遵守NSCopying协议
<span style="font-size:12px;">#import <Foundation/Foundation.h>
@interface Dog : NSObject<NSCopying>
@property (nonatomic,assign) int speed;
@end</span>
3) 实现协议中声明的方法
<span style="font-size:12px;">#import "Dog.h"
@implementation Dog
- (id)copyWithZone:(NSZone *)zone{
NSLog(@"实现copy方法");
Dog *d = [[Dog alloc] init];
d.speed = self.speed;
return d;
}
@end</span>
4) [对象 copy ] 目的: 产生一个副本对象
<span style="font-size:12px;">#import "Dog.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *d1= [Dog new];
d1.speed = 20;
//对象的copy
//自定义对象的copy都是深拷贝
Dog *d2= [d1 copy];
NSLog(@"%d",d2.speed);
}
return 0;
}</span>
单例模式的实现
1)某个类只能有一个实例。
2)他必须自行创建这个对象
3)必须自行向整个系统提供这个实例
(4)为了保证实例的唯一性,我们必须将
-(id)copyWithZone:(NSZone *)zone
+(id)allocWithZone:(NSZone *)zone
-(id)retain-(NSUInteger)retainCount
-(oneway void)release
-(id)autorelease 的实现方法进行覆盖。
5)这个方法必须是一个静态类
代码实现:
Tools.h
<span style="font-size:12px;">#import <Foundation/Foundation.h>
@interface Tools : NSObject
@property (nonatomic ,assign) int num;
@property (nonatomic ,copy) NSString *text;
+(instancetype)shareInstance;
@end</span>
Tool.m
<span style="font-size:12px;">#import "Tools.h"
//定义一个全局变量
static Tools *instance =nil;
@implementation Tools
//单例的介入方法的实现
+(instancetype)shareInstance{
//保证对象必须唯一
if (instance == nil){
instance =[[Tools alloc] init];
return instance;
}
return instance;
}
@end</span>
Person.h
<span style="font-size:12px;">#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)run;
@end</span>
Person.m
<span style="font-size:12px;">#import "Person.h"
#import "Tools.h"
@implementation Person
-(void)run{
//创建单例对象
Tools *st = [Tools shareInstance];
//调用set方法
st.num =100;
st.text = @"hello world !";
}
@end</span>
main.m
<span style="font-size:12px;">#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p run];
}
return 0;
}</span>