Objective-C基礎 數組、字典、包裝類、時間日期類、文件、kvc

1.OC數組不可以存儲基本數據類型 NSArray: 有序、可以重複、靜態數組

   // 1. 數組創建
        NSArray* array= [NSArray arrayWithObjects:@"110",@"120", nil];
                      NSLog(@"--%@",array);
        
        NSLog(@"count==%lu",[array count]);
        //2.數組遍歷
        for(int i=0;i<[array count];i++){
          NSLog(@"count==%@",  [array objectAtIndex:i]);
        }
        
        //3.  是否包含某一個元素
        BOOL bool1= [array containsObject:@"110"];
        NSLog(@"bool--%i",bool1);
        
        //4. 快速創建數組
         NSArray *arr= @[@155,@100,@30];
       NSArray* newArr=  [arr sortedArrayUsingSelector:@selector(compare:)];
        NSLog(@"newArr--%@",newArr);
        
        Person* p1=[Person new];
        p1.age=100;
        Person* p2=[Person new];
        p2.age=400;
        Person* p3 =[Person new];
        p2.age=200;
        NSArray* pArr=@[p1,p2,p3];
        //5.  自定義排序
        NSArray* pArrNew= [pArr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person*  _Nonnull obj1, Person*   _Nonnull obj2) {
            return  obj1.age - obj2.age;
        }];
        
        //6.  字符串切割
        NSString* str=@"xiao_ze_ming";
        NSArray* strArr= [str componentsSeparatedByString:@"_"];
        NSLog(@"strArr=%@",strArr);
    
        // 7. 把數組寫入文件中
        // 如果把一個數組寫入文件中,本質寫入一個XML文件
        // IOS開發中一般情況下我們會將xml 擴展名保存到plist
      //  BOOL flag1= [arr writeToFile:@"/Users/denganzhi/abc.plist" atomically:true];
     //  NSLog(@"flag1=%i",flag1);
        // 從文件讀取數據
        NSArray* newArray1=[NSArray arrayWithContentsOfFile:@"/Users/denganzhi/abc.plist"];
        NSLog(@"newArray1=%@",newArray1);

2.  動態數組 NSMutableArray:

 // 1. 創建動態數組
    NSMutableArray* arrM=[NSMutableArray arrayWithObject:@"xiaoming1"];
    // 2. 添加
    [arrM addObject:@"xiaohei2"];
    //3.  把指定靜態數組的元素去取出來放入  NSMutableArray 中
    [arrM addObjectsFromArray:@[@"lj1",@"xiaozhi"]];
   // 4. 插入
    [arrM insertObject:@"xcp" atIndex:1];
    // 5. 刪除
    [arrM removeObject:@"xiaoming1"];   //刪除指定元素
    [arrM removeObjectAtIndex:0];  // 刪除指定角標準
    [arrM removeLastObject];   // 刪除最後一個元素
    //6. 替換
    [arrM replaceObjectAtIndex:1 withObject:@"M"];
    // 7. 獲取
    for(int i=0;i< arrM.count;i++){
        NSLog(@"-%d--%@",i,[arrM objectAtIndex:i]);
    }
    NSLog(@"---%@",arrM);

3.   NSDictionary 字典使用: 

// 字典創建方式1:
    NSDictionary* dict1= [NSDictionary dictionaryWithObject:@"xiaoming" forKey:@"username" ];
    NSLog(@"username=%@",[dict1  objectForKey:@"username"]);
    
    // 字典創建方式2:
    NSDictionary* dict2= [NSDictionary dictionaryWithObjects:@[@"xiaoming",@"50"] forKeys:@[@"username",@"age"]];
    
    // 字典的簡單創建:
    NSDictionary *dict3 = @{@"name":@"lnj", @"age":@"30", @"height":@"1.75"};
     NSLog(@"%@ %@ %@", dict3[@"name"], dict3[@"age"], dict3[@"height"]);

    
    // 字典變量
    NSArray* keys= [dict3 allKeys];
    for(int i=0;i<dict3.count;i++){
        NSString* key= keys[i];
        NSString* value= dict3[key];
        NSLog(@"key=%@,value=%@",key,value);
    }
    
    // 迭代器
    [dict3 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSLog(@"key=%@--value:%@",key,obj);
    }];
    
    
    // xml 擴展 plist, NSDictroty 字典和 文件對應
    [dict3 writeToFile:@"/Users/denganzhi/abc.plist" atomically:YES];
    NSDictionary* newDict=[NSDictionary dictionaryWithContentsOfFile:@"/Users/denganzhi/abc.plist"];
    NSLog(@"newDict=%@",newDict);
    

 4.   NSMutableDictionary 字典使用:

 // 1.可變字典
    // 字典創建
    NSMutableDictionary* dictM=[NSMutableDictionary dictionary];
    // 2.添加
    [dictM setObject:@"lnj" forKey: @"username"];
    // 添加傳入參數是字典
    [dictM setValuesForKeysWithDictionary: @{@"age":@"30",@"name":@"xiaoming"}];
    // 3. 刪除
    [dictM removeObjectForKey:@"age"];
    // 4.  獲取
    NSLog(@"username=%@",dictM[@"username"]);
    
    // 5. 修改
    // setObject 存在那麼添加
    // setObject 不存在那麼修改

    [dictM setObject:@"ddahei" forKeyedSubscript:@"name"];
    
     NSLog(@"---%@",dictM);
    
  

  // 可變字典和不可變字典對比
    // 如果是不可變字典出現同名key, 那麼後面的key對一個的值不會被保存
    //如果是可變字典出現同名key, 後面的會覆蓋前面的

5. 常用結構體

   // 常用結構體,保存座標、尺寸、座標和尺寸
   //  CGPoint 和 NSPoint 一樣的 取了一個別名
    NSPoint point= NSMakePoint(100, 200);
    
    NSSize size= NSMakeSize(200, 200);
 
    NSRect rect= NSMakeRect(0, 0, 100, 100);

6.  NSNumber NSValue 包裝類

  //NSNumber  包裝基本數據類型
    int age=100;
    // 1. 將基本數據類型  轉化爲對象類型,對象類型纔可以存儲NSArray
    NSNumber* ageNumber= [NSNumber numberWithInt:age];
    int age1= [ageNumber intValue];
    
    NSLog(@"age1=%d",age1);
     //2. 簡寫,如果是變量必須,@()
    NSNumber* temp=@(age);
    // 基本數據類型寫法
    NSNumber* temp1= @40;
    
    
    // NSValue 包裝結構體
    
   // 1. 如果是OC結構體: 使用系統提供的  valueWithxxx
     CGPoint point = NSMakePoint(10, 20);
    NSValue *value = [NSValue valueWithPoint:point];
    NSLog(@"value=%@",value);
   // 2.  NSValue 包裝自定義結構體
    struct Person{
        int age;
        char* name;
    };
    struct Person p={100,"小明"};
    // 第一個是指針,第二個是結構體類型
    // 把結構體 放入 NSValue中包裝
    NSValue *pValue = [NSValue valueWithBytes:&p objCType: @encode(struct Person)];
    // 保存成 NSValue 纔可以存入 NSArray中
    NSArray* arr= @[pValue];
     struct Person res;
    
    // 從pvalue 中 取出自定義 結構體
    [pValue  getValue:&res];
     NSLog(@"%s", res.name);

  7.  NSDate 、 NSCalendar

  //NSDate: 時間
    //NSDate ---> NString, 輸出當前時間
     NSDate* now=[NSDate new];
    //  在now基礎上 增加一個天 86400
     NSDate* mingtiang= [now dateByAddingTimeInterval:86400]; // 在now
     NSDateFormatter* nsformater= [NSDateFormatter new];
     nsformater.dateFormat=@"yyyy-MM-dd HH:mm:ss";
     NSString* str= [nsformater stringFromDate:now];
     NSString* str1= [nsformater stringFromDate:mingtiang];
     NSLog(@"now時間是:%@",str);
     NSLog(@"mingting時間是:%@",str1);
    // NString —> NSDate
     NSDate* date1= [nsformater dateFromString:str];

    
  // NSCalendar  日曆類
    NSCalendar* calender1= [NSCalendar currentCalendar];
    // 使用l日曆類 從 NSDate中獲取時間
    NSCalendarUnit type =NSCalendarUnitYear |
    NSCalendarUnitMonth |
    NSCalendarUnitDay |
    NSCalendarUnitHour  |
    NSCalendarUnitMinute |
    NSCalendarUnitSecond;
NSDateComponents * cmps= [calender1 components:type
                                      fromDate:now];
    NSLog(@"year==%ld,month=%ld,day=%ld", cmps.year,cmps.month,
          cmps.day);
    
    // 比較2個時間的差值
    NSDate* now2= [NSDate new];
    NSDate* mingtiang2= [now dateByAddingTimeInterval:86400]; // 在now
    NSDateComponents* cmps23 = [calender1 components:type fromDate:now2 toDate:mingtiang2 options:0];
    
    NSLog(@"差距是,year==%ld,month=%ld,day=%ld,h=%ld,min=%ld,ss=%ld", cmps23.year,cmps23.month,cmps23.day,cmps23.hour,cmps23.minute,cmps23.second);

 8.  NSFileManager   文件夾api 使用

  NSFileManager* manager= [NSFileManager defaultManager];
    // 1. 判斷文件是否存在
    BOOL flag=  [manager fileExistsAtPath:@"/Users/denganzhi/abc.plist"];
    NSLog(@"flag=%i",flag);
    // 2. 判斷一個文件是否存在並且是否是一個文件夾
    // 如果存在flag2=1  如果是目錄dir=1
    BOOL dir=NO;
    BOOL flag2= [manager fileExistsAtPath:@"/Users/denganzhi/abc.plist" isDirectory:dir];
    NSLog(@"flag2=%i,dir=%i",flag2,dir);
    //3. 獲取文件或者文件夾屬性
    NSDictionary* info= [manager attributesOfItemAtPath:@"/Users/denganzhi/abc.plist" error:nil];
    // 文件屬性放回在字典中
   // NSLog(@"info=%@",info);
    
    // 4.  獲取文件夾下所有文件
    // 只能獲取當前文件夾下所有文件名稱
      //不能 獲取子孫文件
  NSArray* res = [manager contentsOfDirectoryAtPath:@"/Users/denganzhi/" error:nil];
  //   NSLog(@"res=%@",res);
   
    // 5. 可以獲取  子孫文件
 //   NSArray *res1= [manager subpathsAtPath:@"/Users/denganzhi/githubinfo/"];
    NSArray* res1= [manager subpathsOfDirectoryAtPath:@"/Users/denganzhi/githubinfo/" error:nil];
 NSLog(@"res=%@",res1);
    
    // 6.  創建文件夾,只能創建 文件夾
    // 路徑, 上傳文件不存在,是否自動創建
    // 屬性
    // 錯誤類型
    [manager createDirectoryAtPath:@"/Users/denganzhi/create" withIntermediateDirectories:YES attributes:nil error:nil];
 
   // 7. 文件創建 ,寫入 str7
    NSString* str7=@"小置同學";
    NSData* data7= [str7 dataUsingEncoding:NSUTF8StringEncoding];
    [manager createFileAtPath:@"/Users/denganzhi/create.txt" contents:data7 attributes:nil];

 9.    淺拷貝 和深拷貝  oc中  

深拷貝: 內存拷貝
 NSMutableString* mstr=[NSMutableString stringWithFormat:@"身拷貝"];
 NSString* mstrcopy= [mstr copy];
 深拷貝產生了新的對象,mstr 和 mstrcopy 指針不同

A淺拷貝: 拷貝出來的和原來的都指向同一塊內存
    NSString* str=@"淺拷貝";
    NSString* copystr =[str copy];
    NSLog(@"str=%p,copystr=%p",str,copystr);
   str 和  copystr 都是 指向 同一個字符串,指針相同,除了這種類型,其他的都是深複製
 

10.  單例設置模式: 

Tools.h:

//
//  Tools.h
//  其他api
//
//  Created by 鄧安置 on 2020/5/10.
//  Copyright © 2020 鄧安置. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Tools : NSObject<NSCopying,NSMutableCopying>

// 一般情況下創建一個 單例對象都有一個與之對應的類方法

// 一般情況下用於創建單例對象的方法名都以 share或者 default開發

+(instancetype)shareInstance;

@end

NS_ASSUME_NONNULL_END

Tools.m:

//
//  Tools.m
//  其他api
//
//  Created by 鄧安置 on 2020/5/10.
//  Copyright © 2020 鄧安置. All rights reserved.
//

#import "Tools.h"

@implementation Tools



+(instancetype)shareInstance{
    
    Tools* instance=[[self alloc] init];
    
    return instance;
    
}
static Tools* _instance = nil ;
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    // 單線程版本
    // 調用alloc的時候回調用 該方法
    // 在該方法中控制當前對象只創建一次即可
//    if(_instance == nil){
//        // 申請內存
//        _instance= [[super allocWithZone:zone]  init];
//    }
    
    // 多線程版本
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance= [[ super allocWithZone:zone] init];
    });
    
    return _instance;
}

/**
  所有的oc 對象  都實現 NSCopying,NSMutableCopying  協議,保證可以進行深拷貝
    重新分配內存
 */
- (id)copyWithZone:(NSZone *)zone{
//    Tools* t = [[[self class] allocWithZone:zone] init];
//    return t;
    return  _instance;
}

-(id)mutableCopyWithZone:(NSZone *)zone{
     return  _instance;
}

@end

  main中  使用: 

 // 單例設計模式
    Tools* t1=[Tools shareInstance];
    Tools* t2=[Tools shareInstance];
    // t1 和  t2 地址 相同
    NSLog(@"單例:%p,%p",t1,t2);

11.  IOS  kvc  使用

valueForKey
forKeyPath
setValuesForKeysWithDictionary
valueForKey

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
      //1.  kvc 和 對象
        Person* person=[Person new];
      // 可以kvc 給對象賦值
        [person setValue:@"xiaoming" forKey:@"name"];
        // age 是 int 類 , kvc可以指定類型 轉化
        [person setValue:@"20" forKey:@"age"];
       //  取出p1對象中 age  name 屬性的值
        NSLog(@"name=%@,age=%@",[person valueForKey:@"name"],
              [person valueForKey:@"age"]);
        
        // 2. 對象中還有對象
        Book* book= [Book new ];
        book.bookName=@"飄";
        person.book =book ;
        [person setValue:@"挪威的森林" forKeyPath:@"book.bookName"];
        NSLog(@"bookName=%@",book.bookName);
        
        // 3. kvc與 字典
        // 字典的key值 ->  一定要和對象中的屬性名對應,保存一致
        NSDictionary* dict=@{@"name":@"xiaoze",@"age":@"30"};
        [person setValuesForKeysWithDictionary:dict];
        
        NSLog(@"name=%@,age=%ld", person.name,
                     person.age
              );
        
        // 4.kvc 和 數組
        Person* p1=[Person new];
        p1.age=22;
        Person* p2=[Person new];
        p2.age=400;
        NSArray* array=@[p1,p2];
        NSArray* nameArray= [array valueForKey:@"age"];
        NSLog(@"nameArray=%@",nameArray);
    }
    
    return 0;
}

Person.h

#import <Foundation/Foundation.h>

@class Book; 

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject

@property(nonatomic,copy) NSString* name;

@property(nonatomic,assign) NSInteger age;

@property(nonatomic,strong) Book* book;

@end

NS_ASSUME_NONNULL_END

book.h 

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Book : NSObject

@property(nonatomic,copy)  NSString* bookName;

@end

NS_ASSUME_NONNULL_END

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章