iOS 基础知识大全(OC篇零基础可学习)

不可变字符串

【OC字符串的初始化】

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

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

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

NSString * str3 = [NSString string];

3.字符串的初始化由另外一个字符串给

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

4.C语言的字符串给OC字符串作为初始化的值(减方法)

NSString * str6 = [[NSString alloc]initWithUTF8String:“cccc”];

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    

    原文作者:移动开发
    原文地址: https://my.oschina.net/gongzhiming/blog/637068
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞