黑马程序员--iOS--Objective-C基础 (Foundation框架 二)

------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>


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值