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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值