博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC进阶(三)
阅读量:4950 次
发布时间:2019-06-11

本文共 6633 字,大约阅读时间需要 22 分钟。

1.block的基本使用

#import 
int main(int argc, const char * argv[]) { @autoreleasepool { //1.无参数 无返回值 void(^myBlock)() = ^ { NSLog(@"block"); }; //2.有参无返回值 void(^myBlock2)(int,int) = ^(int a,int y){ NSLog(@"%d",a+y); }; //3.有参数有返回值 int(^myBlock3)(int,int) = ^(int a, int b){ return a+b; }; //block使用 myBlock(); myBlock2(12,14); int c = myBlock3(10,100); NSLog(@"%d",c); } return 0;}

2.block和typedef

#import 
int main(int argc, const char * argv[]) { @autoreleasepool { // 定义一个block变量,并且赋值 void (^myBlock)() = ^{ NSLog(@"helloworld"); }; myBlock(); //定义一个别名 // 给 没有返回值 没有参数的block起一个别名 // Block 是一个类型,不在是一个单纯的变量了 typedef void (^Block)(); Block b1; //block类型的变量 b1 =^{ NSLog(@"helloworld"); }; b1(); //定义有参数\有返回值的 block类型 //定义新的别名 //返回值是int 有两个 int类型的参数 typedef int (^NewType1)(int ,int ); NewType1 nt1 = ^(int a,int b){ return a+b; }; //连续定义多个 NewType类型的变量 NewType1 n1,n2,n3; n1 = ^(int x,int y){ return x>y?x:y; }; int s = nt1(12,23); NSLog(@"s = %d",s); } return 0;}

3.block访问外部的值

#import 
/** * block内部访问外部值的问题 * block内部不允许修改外部变量值 */void test(){ int m = 10; NSLog(@"1:m = %d",m); //10 NSLog(@"2:m addr = %p",&m); //栈区 // NSString *str = @"abc"; // NSLog(@"str = %p",str); //定义变量,并且赋值 //当定义block的时候,block会把外部变量以const的方式复制一份 //存放到block的所在的内存中 void (^myBlock)()=^{ //m的值不能被修改 //m = 100; NSLog(@"5:m addr = %p",&m); //堆区 //可以访问m的值 NSLog(@"3:in block m = %d",m); // ? }; NSLog(@"4:m addr = %p",&m); //栈区 //使用 myBlock(); // 1 2 4 5 3}//int n=0;int main(int argc, const char * argv[]) { @autoreleasepool { __block int m = 10; NSLog(@"1:m add = %p",&m); //栈区地址 //__block 不在以const的方式拷贝 void (^myBlock)()=^{ //m的值不能被修改 m = 100;// n = 10;// int m = 100; NSLog(@"5:m addr = %p",&m); //堆区 //可以访问m的值 NSLog(@"3:in block m = %d",m); // ? }; myBlock(); NSLog(@"6:m = %d",m); // ? NSLog(@"7:m addr = %p",&m); } return 0;}

4.block作为函数的返回值

#import 
//返回值是block类型的//void (^block)();//定义新的block类型//1) 使用 typedef 定义一个新的类型typedef void (^newType)();//block类型作为函数的返回值//2) 用新定义的类型作为函数的返回值newType test(){ //定义block变量 newType w1 = ^{ NSLog(@"xxxxx"); NSLog(@"hello world"); }; return w1; //返回值block}//重新定义了一个新的类型 newType2typedef int(^newType2)(int ,int );newType2 test2(){ //返回一个特殊的"值" 这个值是一个有返回值,有两个参数的的代码块 return ^(int a,int b){ return a+b; };}int main(int argc, const char * argv[]) { @autoreleasepool { //定义block类型的变量 //3) 定义block变量接收 函数返回的结果 newType n1 = test(); //4) 执行block n1(); /* n2 =^(int a,int b){ return a+b; }; */ newType2 n2 = test2(); //调用block int s = n2(23,12); NSLog(@"s = %d",s); } return 0;}

5.block作为方法的参数

#import "Person.h"@implementation Person-(void)test:(BlockType) block{    if (block !=nil) {                block();            }         }@end
#import 
#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; [p test:^{ NSLog(@"xxxxx"); }]; } return 0;}

6.协议

/*     1 - 什么是协议?        一些方法的声明,一般写到一个.h的头文件中       方法有两种:        1) 必须实现       2) 选择实现      2 - 协议的作用:        供其他的类去遵守,       如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法      3 - 如何定义一个协议:        @protocol xxx 
默认情况下遵守 NSObject协议 @end 4 - 类遵守协议的格式: 1) 遵守一个协议: 先导入头文件 @interface 类名 :NSObject
@end 2) 遵守多个协议 @interface 类名 :NSObject
@end */

7.@required @optional 

@protocol baseProtocol 
//@required 和 @optional 都是协议中的关键字//@required 修饰的方法是必须要实现的@required //默认情况下都是必须要实现的-(void)run;-(void)eat;//@optional 修饰的方法是可以实现,也可以不实现的@optional-(void)dajia;@end

8.protocol的类型限制

int main(int argc, const char * argv[]) {    @autoreleasepool {                Dog *d = [Dog new];        Girl *mm = [Girl new];                NSString *str =@"";        //增加类型限制        // 第一种类型限制:给id类型增加限制        // id
obj; //增加
以后,表示,obj只能赋值遵守了houseHold协议的对象 //id
obj = d; // 第二种类型限制: //表示,obj2赋值的时候,必须是Girl对象,并其遵守 了 houseHold协议. Girl
*obj2 = mm; // 第三种类型限制 obj2.dog = d; } return 0;}
@interface Girl : NSObject
//女孩养一条狗,//要求这个狗,必须会算数@property (nonatomic,strong) Dog
*dog;@end

9.代理模式

#import 
@class Baby;@protocol lookBabyProtocol
//喂婴儿吃饭-(void)feedBabyEat:(Baby *)baby;//哄婴儿睡觉:(Baby *)baby-(void)HongBabySleep:(Baby *)baby;@end
#import 
@class BaoMu;#import "lookBabyProtocol.h"@interface Baby : NSObject@property (nonatomic,assign) float blood;@property (nonatomic,assign) float sleep;//保姆、体力值、睡眠值@property (nonatomic,strong) BaoMu
*bm;-(void)wantEat;-(void)wantSleep;@end
#import "Baby.h"#import "BaoMu.h"@implementation Baby-(void)wantEat{    NSLog(@"婴儿在哭...");    //保姆要喂它吃    [self.bm feedBabyEat:self];}-(void)wantSleep{    NSLog(@"婴儿在哭...");    //保姆哄婴儿睡觉    [self.bm HongBabySleep:self];}@end
#import 
//保姆想成为baby的代理人,就必须遵守lookBabyProtocol协议#import "lookBabyProtocol.h"@interface BaoMu : NSObject
@end
@implementation BaoMu//喂婴儿吃饭-(void)feedBabyEat:(Baby *)baby{    baby.blood += 20;    NSLog(@"保姆正在喂婴儿吃东西,baby.blood = %.2f",baby.blood);}//哄婴儿睡觉-(void)HongBabySleep:(Baby *)baby{    baby.sleep += 10;    NSLog(@"保姆正在哄婴儿睡觉,baby.sleep = %.2f",baby.sleep);}@end

 

转载于:https://www.cnblogs.com/iosnds/p/4917677.html

你可能感兴趣的文章
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>
springboot+mybatis报错Invalid bound statement (not found)
查看>>
Linux环境下SolrCloud集群环境搭建关键步骤
查看>>
P3565 [POI2014]HOT-Hotels
查看>>
UVa11078:Open Credit System
查看>>
MongoDB的简单使用
查看>>
git clone 遇到的问题
查看>>
hdfs 命令使用
查看>>
hdu 1709 The Balance
查看>>
prometheus配置
查看>>
定宽320 缩放适配手机屏幕
查看>>
BZOJ 2120 数颜色 【带修改莫队】
查看>>
【noip2004】虫食算——剪枝DFS
查看>>
Codeforces 40 E. Number Table
查看>>
CLR via C#(第3 版)
查看>>
java语法之final
查看>>
关于响应式布局
查看>>
详解ASP.Net 4中的aspnet_regsql.exe
查看>>
python 多进程和多线程的区别
查看>>