iOS 基礎知識大全(OC篇零基礎可學習)

不可變字符串json

【OC字符串的初始化】數組


1.字符串的初始化(減方法)app

NSString * str2 = [[NSString alloc]init];函數


2.字符串的初始化(加方法)測試

NSString * str3 = [NSString string];ui


3.字符串的初始化由另一個字符串給atom

NSString * str4 = [[NSString alloc]initWithString:str1];url


4.C語言的字符串給OC字符串做爲初始化的值(減方法)spa

NSString * str6 = [[NSString alloc]initWithUTF8String:"cccc"];3d


5.將C語言的字符串給OC字符串做爲初始化的值(加方法)

NSString * str7 = [NSString stringWithUTF8String:"ccccc"];


6.自定義格式的OC字符串初始化(減方法)

NSString * str8 = [[NSString alloc]initWithFormat:@"%d %c %@",2,'A',@"ohhhh~" ];


7.自定義格式的OC字符串初始化(加方法)

NSString * str9 = [NSString stringWithFormat:@"%d %c %@",2,'B',@"shabi~~"];



【將OC字符串轉成其餘類型】


1. 把字符串轉成int類型

int i = [str intValue];


2 .把字符串轉成float類型

float f = [str floatValue];


3.把字符串轉成long long類型

long long l = [str longLongValue];


4。把字符串轉成OC的NSUInteger類型

NSUInteger n = [str integerValue];


5.把字符串轉成double類型

double d = [str doubleValue];


6。把字符串轉成BOOL類型

BOOL b = [str boolValue];


7.把字符串轉成c語言的字符串

const char * p = [str UTF8String];


【字符串的比較】

1.比較字符是否是相同

BOOL ret = [str1 isEqualToString:str2];


2.比較兩個字符串的大小

NSComparisonResult ret1 = [str1 compare:str2];


返回值:

NSOrderedSame 相等

NSOrderedDescending :降序(左邊大於右邊)

NSOrderedAscending:升序 (右邊大於左邊)


3.獲得字符串的長度

NSUInteger len = [str1 length];


4.獲得OC字符串的第幾個字符

unichar c = [str1 characterAtIndex:0];

遍歷:

for ( int i = 0 ; i < len; i ++) {

            c = [str1 characterAtIndex:i];

            NSLog(@"%c",c);

        }


【子串】


1.在父串中查找子串的範圍

NSRange rang = [str rangeOfString:subStr];

        /*

         typedef struct _NSRange {

         NSUInteger location;  //索引

         NSUInteger length;    //長度

         } NSRange;

         */


2.提取子串(從索引直到串尾)

NSString * sub1 = [str substringFromIndex:3];


3.提取子串(從開頭到索引 不包括索引)

NSString * sub2 = [str substringToIndex:3];


4.提取某段範圍的子串

sub3 = [str substringWithRange:NSMakeRange(1, 4)];



【大小寫轉換】

1.小寫所有轉成大寫

NSString * st2 = [st1 uppercaseString];


2。大寫所有轉小寫

NSString * st3 = [st1 lowercaseString];



【可變字符串】

【初始化】


1.開闢空間的初始化(減方法)

NSMutableString * str1 = [[NSMutableString alloc]initWithCapacity:10];


2.開闢空間的初始化(加方法)

str1 = [NSMutableString stringWithCapacity:10];


3.帶格式字符串的初始化

NSMutableString * str2 = [[NSMutableString alloc]initWithFormat:@"%@",@"abc"];



【可變字符串的增刪改查】沒有返回值


1.追加

[str2 appendString:@"123"];


2.有格式的追加

[str2 appendFormat:@"%d%@",2,@"asd"];


3.刪除字符串中某個範圍字符

[str2 deleteCharactersInRange:NSMakeRange(0, 2)];


4.插入

[str2 insertString:@"AAA" atIndex:3];


5。修改

[str2 replaceCharactersInRange:NSMakeRange(3, 4) withString:@"MaoGe"];


6.重置

[str2 setString:@"abcd"];


//3種置空方法  刪除 重置 替換

        [str2 deleteCharactersInRange:NSMakeRange(0, [str2 length])];

        [str2 setString:@""];

        [str2 replaceCharactersInRange:NSMakeRange(0, [str2 length]) withString:@""];


不可變數組


【初始化】

1.不可變數組的初始化  (減方法)

NSArray * arr1 = [[NSArray alloc]init];


2.不可變數組的初始化  (加方法)

arr1 = [NSArray array];


3.不可變數組帶參數(對象)的初始化 (減方法)

NSArray * arr2 = [[NSArray alloc]initWithObjects:@"123",@"abc",nil];


4.不可變數組帶參數的初始化 (加方法)

 arr2 = [NSArray arrayWithObjects:@"123",@"www",@"abc",nil];


5. 把其餘數組看成參數的初始化 (減方法)

NSArray * arr3 = [[NSArray alloc]initWithArray:arr1];


6.把其餘數組看成參數的初始化 (加方法)

arr3 = [NSArray arrayWithArray:arr1];


7.數組最經常使用的初始化 —- 直接賦值

NSArray * arr4 = @[@"one",@"two",@"three"];


8.獲取數組元素(對象)的個數

NSUInteger count = [arr4 count];


9.從路徑獲取數組

NSArray * arr = [NSArray alloc]initWithContentsOfFile:path];


【數組 — 字符串】

1.字符串按格式切割成數組

NSString * str = @"one two three";

NSArray * arr5 = [str componentsSeparatedByString:@" "];


2.數組按格式拼接成字符串(不可變字符串)

NSString * str1 = [arr5 componentsJoinedByString:@"*"];


【數組遍歷】

1.普通遍歷 最常規的方法

for (int i = 0; i < [arr5 count]; i ++) {

            NSLog(@"%@",arr5[i]);

        }


2.快速遍歷 首先要明確元素的類型

for (NSString * str in arr5) {

            NSLog(@"%@",str);

        }


3.枚舉器遍歷

//把數組的元素放到枚舉器裏邊

//緣由:有一個方法能夠遍歷本身枚舉器裏面的元素

NSEnumerator * enumer = [arr5 objectEnumerator];

id obj;

while (obj = [enumer nextObject]) {

   NSLog(@"%@",obj);

}


4.枚舉器逆序變量

NSEnumerator * enumer1 = [arr5 reverseObjectEnumerator];

id obj1;

while (obj1 = [enumer1 nextObject]) {

      NSLog(@"%@",obj1);

}


5.最裝逼的遍歷

[arr5 enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){

     //obj  元素

     //idx 索引

     //*stop 是否中止         

    NSLog(@"%@ %ld",obj,idx);

 }];


【獲取數組的元素】

1.獲取數組的第一個元素

NSString * str =[array firstObject]; 


2.獲取數組最後一個元素

NSString * str1 = [array lastObject];


3.獲取指定索引的元素

NSString * str2 = [array objectAtIndex:1];


4.經過元素得到該元素的索引

NSUInteger index = [array indexOfObject:@"1"];


5.根據元素在指定範圍內找其索引

index = [array indexOfObject:@"2" inRange:NSMakeRange(0, 2)];


6.判斷該數組有沒有該元素

BOOL ret = [array containsObject:@"2"];




可變數組

【初始化】

1.給一個大小的初始化

NSMutableArray * arr = [[NSMutableArray alloc]initWithCapacity:10];


【增長】

1.添加一個元素

[arr addObject:@"one"];


2.添加多個元素

[arr addObjectsFromArray:array];


【插入】

1.插入元素到指定索引 其餘元素自動後退

[arr insertObject:@"two" atIndex:0];


2.插入多個元素到指定範圍

[arr insertObjects:array atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)]];


【替換】

1.替換指定索引的元素

[arr replaceObjectAtIndex:1 withObject:@"three"];


【刪除】

1.刪除指定元素

[arr removeObject:@"one"];


2.刪除最後一個元素

[arr removeLastObject];


3.刪除指定範圍內指定的元素

[arr removeObject:@"1" inRange:NSMakeRange(0, 10)];


4.刪除索引上的元素

[arr removeObjectAtIndex:0];


5.刪除全部的元素

[arr removeAllObjects];


【重置】

[arr setArray:array];


【判斷數組是否相等】

[arr isEqualToArray:array];


【交換元素位置】

[countArray exchangeObjectAtIndex:j withObjectAtIndex:j + 1];





不可變字典  

【初始化】

1.  value   —  key

NSDictionary * dict =[[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2", nil];


2.批量設置鍵值對    value — key

NSArray * arr1 = @[@"1",@"2"];

NSArray * arr2 = @[@"one",@"two"];

NSDictionary * dict1 = [[NSDictionary alloc]initWithObjects:arr1 forKeys:arr2];


3.  key : value

NSDictionary * dict3 = @{@"1":@"one",@"2":@"two",@"3":@"one"};


4.經過key拿到value

NSString * str1 = [dict3 objectForKey:@"1"];


5.拿到全部的key

NSArray * arr3 = [dict3 allKeys];


6.拿到全部的Value

arr3 = [dict3 allValues];


7.拿到全部相同valuekey  (key必定惟一存在 value不惟一)

arr3 = [dict3 allKeysForObject:@"one"];


【遍歷】

1.普通遍歷

 for (int i = 0; i < [arr3 count]; i ++) {

      NSLog(@"%@",[dict3 objectForKey:arr3[i]]);

}


2.快速遍歷

for (NSString * str in dict3) {

    //str key

    NSLog(@"%@",dict3[str]);

}


【可變字典】

【初始化】

1.帶參數的初始化

NSMutableDictionary * mDict = [NSMutableDictionary dictionaryWithDictionary:dict3];


2.設置鍵值對    value ———— key

[mDict setValue:@「one」 forKey:@「1」];


3.刪除鍵值對

[mDict removeObjectForKey:@"one"];


4.刪除全部鍵值對

[mDict removeAllObjects];


5.根據key值 批量刪除鍵值對

[mDict removeObjectsForKeys:arr3];


6.重置

[mDict setDictionary:dict3];





【繼承】

1.子類能夠繼承父類公開和受保護的成員變量、屬性、方法

【注】 若是父類的屬性沒有聲明爲受保護的 是不能繼承的(此時的屬性是私有的)

【注】沒有聲明(.h)的方法不能繼承


2.重寫

繼承來父類的方法 子類能夠用  可是不能知足子類

1⃣️ 徹底重寫


2⃣️部分重寫 [super  父類的方法]   以後是子類獨有的部分

例如:

-(instancetype)init{

   // self = [super init];//先初始化父類

    if (self = [super init]) {

        //初始化子類獨有的部分

        _a = 1;

        _b = 2;

        _age = 10;

    }

    return self;

}

//不徹底重寫

-(void)jump{

    [super jump];//經過super調用父類的方法

    NSLog(@"能夠大小跳");//實現子類派生部分

    [self run];

}



3.做用

1⃣️不少對象有不少共同屬性 建立一個父類  由這些對象繼承

2⃣️繼承官方的類或者第三方類 符合本身當前的工程

【注】類簇(工廠類)不能繼承 (例如 NSString 等)

3⃣️經過繼承統一多態的接口    (父類指針能夠指向子類)

-(void)beatAnimal:(Animal *)ani;




【多態】

1. 重寫 重載 虛函數(統一接口)

2.同一個接口(同一個方法) 不一樣的實現 (重寫、重載)

3.同一個動做(方法)對不一樣的事物,會有不一樣的反應(虛函數)

//-(void)beatAnimal:(Dog *)dog;

//-(void)beatAnimal1:(Cat *)cat;

//-(void)beatAnimal2:(Lion *)lion;


-(void)beatAnimal:(Animal *)ani;


【類別】Catogary 

(主要用於第三方類的引用方法、從新定義這個方法、添加方法)

//給源類(系統類)打補丁,能夠分門別類地管理這個類

主要用於第三方類 有時候第三方類的方法不能知足 這個時候咱們就要用類別擴寫方法引用

例如 NSString有些方法不能知足咱們

【注】

1.引入頭文件 

2.類別不能夠添加成員變量,可是能夠添加屬性和成員方法

3. 方法的名字儘可能不要和源類相同

例如:

#import "NSString+Show.h"

@implementation NSString (Show)

//在類別裏聲明實現的方法,至關於在源類裏增長了這個方法

-(void)show1{

    NSLog(@"這是一個字符串!");

}


-(void)show2{

    NSLog(@"這真的是一個字符串!");

}


-(NSUInteger)length{

    return 10;

}


- (BOOL)hasPrefix:(NSString *)aString{

    return YES;

}

@end


【匿名類別】

//能夠添加屬性( 根據這些屬性 )添加新的方法

兩種存在形式

1.單獨文件

Person_Show.h   一個文件沒有.m文件   去」Person.m」實現

#import "Person.h"


@interface Person ()//匿名類別

{

    int _a;

}


@property int b;


-(void)show;


@end


2.寫在"Person.m」裏面

#import "Person.h"

//()內沒有類別的名字,這種叫匿名類別

@interface Person ()

{

    //匿名類別能夠聲明成員變量

    int _aa;

    int _bb;

}


-(void)show444;//方法的私有化(沒有絕對的私有方法)


@end


@implementation Person

{

    int _a;

    int _b;

}


-(void)show444

{

}


-(void)show{

    _a = 10;

   // [self show1];

    NSLog(@"sss");

}


-(void)show1{

    _b = 11;

    [self show];

}


@end


1.聲明Dog這個類 能夠根據Dog類創建dog對象 也能夠根據cl創建dog類

 Class cl = [Dog class];//類方法  編譯時肯定

 Dog * dog = [[Dog alloc]init];  //編譯時肯定

  Dog * dog1 = [[cl alloc]init];  


2.根據字符串創建Class變量 運行時 靈活性

Class cl3 = NSClassFromString(@"Dog"); //運行時肯定


3.根據cl3創建一個對象 能夠用id接

id obj3 = [[cl3 alloc]init];


4.判斷這個對象是否是屬於這個類

BOOL ret = [obj isKindOfClass:[Dog class]];


5.選擇器函數 裝函數的類型   參數只能是對象

SEL sel1 = @selector(show); //不帶參

SEL sel1 = @selector(show:); //帶一個參

SEL sel1 = @selector(show: show:);//最多帶兩個參    


6.判斷這個obj這個對象有沒有SEL選擇器攜帶的方法 有沒有響應

BOOL ret2 = [obj respondsToSelector:sel1];


7.對象調用選擇器方法

[obj performSelector:sel1];//無參方法的調用

[obj performSelector:sel1 withObject:dog]; //一個參數的調用

[obj performSelector:sel1 withObject:dog withObject:dog];//兩個參數的調用


8.常常調用選擇器方法會發生警告 消除警告的宏

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

//中間爲obj調用SEL選擇器代碼

#pragma clang diagnostic tests


9.根據字符串創建SEL選擇器變量

SEL sel2 = NSSelectorFromString(@"show:");



【建立單例對象】

1、文件單例 — 操控文件

NSFileManager * ma = [NSFileManager defaultManager];


2.報錯對象

__autoreleasing NSError * error;



【查看】

1.查看文件  —  深度遍歷 (全部子文件(目錄))

NSArray * arr = [ma subpathsOfDirectoryAtPath:PATH error:&error];


2.查看文件  —  淺度遍歷  (本層文件(目錄))

NSArray * arr2 = [ma contentsOfDirectoryAtPath:PATH error:&error];


3.查看文件的屬性

NSDictionary * dict = [ma attributesOfItemAtPath:PATH error:&error];


4.查看文件是否存在

BOOL ret = [ma fileExistsAtPath:PATH];


5.查看文件是文件仍是文件夾(目錄) ret1 爲YES 文件夾   ret1 爲NO 文件

BOOL ret1;

[ma fileExistsAtPath:PATH isDirectory:&ret1];


【建立】

1.拼接路徑

NSString * str = [PATH stringByAppendingPathComponent:@"目錄1/目錄"];


2.根據字符串拼接路徑

NSString * str = [PATH stringByAppendingString:@"/目錄1/mul"];


3.自定義拼接路徑

NSString * str = [PATH stringByAppendingFormat:@「/%@/mul」,path];


4.建立路徑

BOOL ret2 = [ma createDirectoryAtPath:str withIntermediateDirectories:YES attributes:nil error:&error];

//第一個參數:路徑  第二個參數:是否建立中間目錄,若是YES會替咱們建立中間目錄

//第三個參數:屬性 第四個參數:報錯信息


5.建立文件

1⃣️拼接文件路徑

NSString * str = [PATH stringByAppendingPathComponent:@"文件.txt"];

2⃣️定義文件內容 (字符串)

NSString * str1 = @"🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅";

3⃣️將字符串(內容)寫入數據流

NSData * data = [str1 dataUsingEncoding:NSUTF8StringEncoding];

4⃣️建立文件 同時將(數據流)寫入文件

BOOL ret = [ma createFileAtPath:str contents:data attributes:nil];

//第一個參數:路徑  第二個參數:數據流 第三個參數:屬性




【移動】

1.文件(目錄)移動   原路徑 — 目的路徑

BOOL ret = [ma moveItemAtPath:path1 toPath:path2 error:&error];

//第一個參數:源目錄路徑 第二個參數:目的目錄路徑




【拷貝】

1.文件(目錄)拷貝  原路徑 — 目的路徑

BOOL ret = [ma copyItemAtPath:path1 toPath:path2 error:nil];




【刪除】

BOOL ret = [ma removeItemAtPath:path error:nil];







【建立句柄】 經過操做句柄來操做文件


【初始化】


1.讀出哪一個文件

 NSFileHandle * han1 = [NSFileHandle fileHandleForReadingAtPath:@"/Users/wangchuncheng/Desktop/OCDay9/文件.txt"];


2.寫入哪一個文件

NSFileHandle * han2 = [NSFileHandle fileHandleForWritingAtPath:@"/Users/wangchuncheng/Desktop/OCDay9/文件.txt"];




【句柄定位】

1.定位到文件尾部

[han1 seekToEndOfFile];


2.定義到某個字節

[han1 seekToFileOffset:20];


3.獲得當前句柄的定位

unsigned long long  l = han1.offsetInFile;




【讀出數據流data】

han1定義爲讀出

1.讀到文件尾部

NSData * data = [han1 readDataToEndOfFile];


2.讀到某個字節

NSData * data3 = [han1 readDataOfLength:4];


3.把data   轉成  str

NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];


4. str  轉成 data

 NSData * data =  NSData * data2 = [@"abcd" dataUsingEncoding:NSUTF8StringEncoding];




【把數據流寫入】

han2定義爲寫入

1.將數據流所有寫入

[han2 writeData:data2];


2.定位

[han2 seekToFileOffset:2];


【注意】

1⃣️索引超過文件字節  以後的寫入不執行

2⃣️索引沒超過文件字節  寫入的字節多大就會覆蓋多大 以後接着寫

3⃣️想要接着內容繼續寫 就把句柄定位到文件尾部









【歸檔】

數據的持久化

1⃣️可變數據流(已備歸檔要將數據寫進去data)

NSMutableData * data1 = [NSMutableData data];


2⃣️初始化歸檔對象  (將歸檔內容寫入哪一個數據流)

NSKeyedArchiver * arc = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data1];


3⃣️arc歸檔  對象 —— 關鍵字

[arc encodeObject:dog forKey:@"班級"];


4⃣️封口

[arc finishEncoding];



🈚️把數據寫進文件     data —— file

[data1 writeToFile:@"/Users/wangchuncheng/Desktop/OCDay9/班級.super" atomically:YES];


【解歸檔】

1⃣️把文件內容讀出到數據流 data

NSData * data2 = [NSData dataWithContentsOfFile:@"/Users/wangchuncheng/Desktop/OCDay9/班級.super"];


2⃣️初始化解歸檔對象  (從哪裏data 讀出)

NSKeyedUnarchiver * uarc = [[NSKeyedUnarchiver alloc]initForReadingWithData:data2];


3⃣️解歸檔對象 根據關鍵字解碼對象   

cl = [uarc decodeObjectForKey:@"班級%d"];


4⃣️封口

[uarc finishDecoding];


【子對象如何遵照coding協議】


1.頭文件加<NSCoding>


#import <Foundation/Foundation.h>


@interface Student : NSObject<NSCoding>


@property (nonatomic,copy) NSString *name;


@property (nonatomic,assign) int score;


@property (nonatomic,copy) NSString *sex;


@end


#import "Student.h"



2. 實現文件分別實現歸檔和解歸檔方法


@implementation Student


-(void)encodeWithCoder:(NSCoder *)aCoder{

    [aCoder encodeObject:self.name forKey:@"名字"];

    [aCoder encodeObject:self.sex forKey:@"性別"];

    [aCoder encodeInt:self.score forKey:@"分數"];

}


-(id)initWithCoder:(NSCoder *)aDecoder{

    

    if (self = [super init]) {

        self.name = [aDecoder decodeObjectForKey:@"名字"];

        self.sex = [aDecoder decodeObjectForKey:@"性別"];

        self.score = [aDecoder decodeIntForKey:@"分數"];

    }

    return self;

}


@end


1.建立模型類存儲數據

#import <Foundation/Foundation.h>


@interface BookModel : NSObject


@property (nonatomic,copy) NSString *name;


@property (nonatomic,copy) NSString *auther;


@property (nonatomic,copy) NSString *price;


@property (nonatomic,copy) NSString *summary;


@end


2.建立管理類 ①初始化可變數組/字典存儲模型對象  ②解析Json建立模型對象       ③管理模型 

 

1⃣️初始化可變數組/字典存儲模型

{

    NSMutableArray *_arr;

}


-(instancetype)init{

    if (self = [super init]) {

        _arr = [[NSMutableArray alloc]init];

    }

    return self;

}


2⃣️解析Json建立模型

-(void)praseJson{

//路徑

    NSString * path = @"http://onepiece.local/SH/json/Bookjson";

    

    //轉成網址對象

    NSURL *url = [NSURL URLWithString:path];

    

    //從網址讀內容

    NSData *data = [NSData dataWithContentsOfURL:url];

    

    //解析

    NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

    

    NSArray *array = dict[@"root"][@"books"][@"book"];

    for (NSDictionary * dic in array) {

        //建立模型對象 存儲數據

        BookModel * book = [[BookModel alloc]init];

        book.name = dic[@"name"];

        book.price = dic[@"price"];

        book.summary = dic[@"summary"];

        book.auther = dic[@"auther"][@"name"];

        [_arr addObject:book];

    }

}




3.只給main函數一個測試接口

//打印

-(void)print{

    for (BookModel * mo in _arr) {

        NSLog(@"%@ %@ %@ %@",mo.name,mo.auther,mo.price,mo.summary);

    }

}

+(void)test{

    MyJson * json = [[MyJson alloc]init];

    [json praseJson];

    [json print];

    

}

【協議】

1.規範接口  

2.實現對象之間的交互

3.能夠模擬多繼承(遵照多個協議)


注:協議裏面的方法

1⃣️必須遵照:默認或 @required 修飾

2⃣️可選方法:@optional 修飾




【代理模式】

1.代理傳值 (正向傳值) 代理作事


      人  ——>  狗/貓/獅子 去看門

    (主動方)        (被動方)

        代理

   (擬定協議)    (遵照協議)

1           :          n



2.代理回調

 

       頁面                             下載類

          n                 :                 1

(遵照協議)                  (擬定協議)

  (被動方)                       (主動方)

  代理


1⃣️    傳網址  —————>  接收網址

2⃣️                                        下載類解析網址存儲數據

3⃣️  接收數據 <—————   返回數據 

(實際上是代理經過協議的方法本身取回數據) 




【代理傳值】(正向傳值)


1.主動方擬訂協議


@protocol MyProtocol1 <NSObject>


-(void)print;


@end


2.主動方設置代理對象

@property (nonatomic,weak) id<CompareProtocol>delegate;


3.被動方(代理)遵照協議

@interface Cat : NSObject<CompareProtocol>


4.被動方(代理)實現協議方法

-(void)print;



【代理的回調】


1.主動方擬定協議 ( 通常是下載類)


@protocol DownloadMess <NSObject>


-(void)getMess:(NSString *)mess;//返回數據


@end


2.主動方下載類設置遵照協議對象的屬性

@property (nonatomic,weak) id<DownloadMess>delegate;



3.主動方解析數據的方法包含代理回調數據的方法

-(void)dowanload:(NSString *)path;   

 注:  👆裏面包含着代理遵照協議取回數據的方法

-(void)getMess:(NSString *)mess;



4.被動方遵照協議

@interface Controller1 : NSObject<DownloadMess>



5.被動方拿回數據

1⃣️建立主動方(下載類)對象

Download * down = [[Download alloc]init];

2⃣️將下載類對象的代理設置爲本身

down.delegate = self;

3⃣️調用主動方(下載類)解析數據的方法 

[down dowanload:@"www.baidu.com"];



Block:是管理程序中代碼塊的對象 


1.block的聲明和實現

int(^block1)(int,int) = ^(int a,int b){


            return a + b;

};



2.block的執行部分:

int sum = block1(1,2);

【注】block的調用  Block的聲明的和實現都不執行代碼,只有調用纔會執行



3.系統中的block  (數組的遍歷)

NSArray * arr = @[@"one",@"two"];

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){

      //obj是元素

      //idx是索引

      //*stop是是否中止循環

      if ([obj isEqualToString:@"one"]) {

          *stop = YES;

      }


      NSLog(@"%@ %ld",obj,idx);

      //至少會循環一次


}];




【block的重要運用】


 block回調 (比代理的回調簡單方便)



【方式1】


界面類                                                                           下載類

1.聲明和實現block1     1.經過設置成員方法接收block1(調用block1)

(想要從下載類得到什麼數據                               2.block1(arr) 返回數據

block1的參數就設定什麼)

2.經過下載類方法向下載類傳送block1



舉例:

1⃣️界面類#import "Controller.h"


-(void)downloadMess{

 //定義block

void(^block)(NSMutableArray *) = ^(NSMutableArray *arr){


        NSLog(@"下載完了/.....");

        //存儲下載後的數據

        _arr = arr;

    };


//初始化下載類  讓下載對象去下載數據

    Download * obj = [[Download alloc]init];


    //下載對象調用下載數據的方法

    [obj parseData:@"www.baidu.com" withBlock:block];


}



2⃣️下載類   #import "Download.h"


-(void)parseData:(NSString *)path withBlock:(void (^)(NSMutableArray *))block1{


     。。。。下載解析過程

//把數據返還給界面類

  

//block傳回數據

    block1(arr);


}





【方式2】

界面類                                                                          下載類

1.設置block1  1.經過設置屬性(block屬性)接收block1

2.經過設置下載類block屬性傳送block12.self.block(arr)傳回數據


1⃣️界面類    #import "Controller.h"


-(void)downloadMess{

 //定義block

void(^block1)(NSMutableArray *) = ^(NSMutableArray *arr){

        _arr = arr;

    };


//讓下載類去下載數據

    Download * obj = [[Download alloc]init];

//設置下載類的block屬性

obj.block = block1;

    //下載類對象調用下載數據的方法

    [obj parseData:@"www.baidu.com"];


}



2⃣️下載類  #import "Download.h"


//block屬性

@property (nonatomic,copy) void(^block)(NSMutableArray *);


//成員方法

-(void)parseData:(NSString *)path{


     。。。。下載解析過程


    self.block(_arr);


}




NSValue 把基本類型 、基本類型的複合對象(C數組等)、對象(OC數組、OC字符串等)存儲起來


1.把複合類型轉化成對象

int a[5] = {1,2,3,4,5}; 

NSValue * value1 = [NSValue valueWithBytes:&a objCType:@encode(int[5])];


【注】

@encode

1.OC支持的類型的字符串

2.知道數據類的大小

NSLog(@"%s",@encode(int[10]));//[10i]

NSLog(@"%s",@encode(int));//i

NSLog(@"%s",@encode(char));//c



2.提取Value裏面的內容

1⃣️必須知道value1存儲的類型

int b[5];

2⃣️ 從value1中提取出來的內容存在b數組內   

[value1 getValue:&b];  



3.NSValue存儲OC字符串對象

NSValue * value2 = [NSValue valueWithNonretainedObject:@"字符串"];



4.從NSValue中提取字符串對象

NSString * str = [value2 nonretainedObjectValue];



5.存儲OC數組對象

NSArray * arr = @[value1,@"1"];

value2 = [NSValue valueWithNonretainedObject:arr];



6.NSValue中提取OC數組

NSArray * arr1 = [value2 nonretainedObjectValue];



7.判斷兩個NSValue對象是否相同

BOOL ret = [value1 isEqualToValue:value2];





1.把int類型轉成對象  (減方法)

NSNumber * num1 = [NSNumber numberWithInt:a];


2.把int類型轉成對象  (加方法)

num1 = [[NSNumber alloc]initWithInt:a];


3.把基本類型轉成NSNumber (方式三)

num1 = @2;

num1 = @4.5;

num1 = @YES;

num1 = @'s';


4.NSNumber轉成基本類型

 int b = num1.intValue;


5.比較兩個NSNumber對象

NSComparisonResult ret = [@2 compare:@3];

if (ret == 0) {

            NSLog(@"相等");

        }else if (ret == 1){

            NSLog(@"左邊大於右邊");

        }else if (ret == -1){

            NSLog(@"右邊大於左邊");

        }



6.比較兩個NSNumber類型的對象是否相等

if ([@2 isEqualToNumber:@2] == YES) {

            NSLog(@"相等");

        }

【注】NSNumber 繼承於 NSValue  因此也能夠用👇這種方式

if ([@2 isEqualToValue:@2]) {

            NSLog(@"相等");

        }


【NSDate】

1.建立一個時間點對象

NSDate * date = [NSDate date];

NSLog(@"%@",date);  //2015-08-09 03:56:21 +0000

//格林尼治時間  本初子午線時間 0°經線  咱們在東八區 120°E


2.當前時間過了多少 精確到秒     8*60*60  表示8個小時

date = [NSDate dateWithTimeIntervalSinceNow:8*60*60];

NSLog(@"~~%@",date);  //2015-08-09 11:56:21 +0000


3.返回以1970/01/01 GMT爲基準,而後過了secs秒的時間

date = [NSDate dateWithTimeIntervalSince1970:3600];

NSLog(@"%@",date);//1970-01-01 01:00:00 +0000


4.返回以2001/01/01 GMT爲基準,而後過了secs秒的時間

date = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];

NSLog(@"%@",date);//2001-01-01 01:00:00 +0000


5.以當前時間(Now)爲基準時間,返回實例保存的時間與當前時間(Now)的時間間隔

NSTimeInterval num = [date timeIntervalSinceNow];

NSLog(@"%f",num);//-0.005570



6.返回不少年之後的將來的某一天。 好比你須要⼀一個比如今(Now)()很長時間的時間值,則能夠調用該方法。

date = [NSDate distantFuture];

NSLog(@"%@",date); //4001-01-01 00:00:00 +0000



7.返回不少年之前的某一天。好比你須要⼀一個比如今(Now)()大很長時間的時間值,則能夠調用該方 法。

date = [NSDate distantPast];

NSLog(@"%@",date); //0001-12-30 00:00:00 +0000



【NSZone】

1.建立你所在的當前時區對象

NSTimeZone * zone1 = [NSTimeZone systemTimeZone];

NSLog(@"%@",zone1);//Asia/Chongqing (GMT+8) offset 28800


2.返回TimeZone支持時區的鍵值對

NSDictionary * dic = [NSTimeZone abbreviationDictionary]





【NSDateFormatter】

1.建立時間戳對象

NSDateFormatter * matt = [[NSDateFormatter alloc]init];


2.按照格式輸出時間(自動變成當前系統時間)

matt.dateFormat = @"yyyyMMdd HH:mm:ss.S";

NSLog(@"%@",[matt stringFromDate:date]);//20150805 15:10:09.1


【注】年:yyyy

月:MM

日:dd

小時:HH

分鐘:mm

秒:ss

毫秒:S    

相關文章
相關標籤/搜索