不可變字符串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.拿到全部相同value的key (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 = @"yyyy年MM月dd日 HH:mm:ss.S";
NSLog(@"%@",[matt stringFromDate:date]);//2015年08月05日 15:10:09.1
【注】年:yyyy
月:MM
日:dd
小時:HH
分鐘:mm
秒:ss
毫秒:S