黑马程序员————第三天



函数指针别名


typedef int (*NewType)(int x,int y);
NewType f1,f2,f3;


block 的typedef


格式:type 返回值类型(^block变量名是新别名)(参数类型列表);


typedef int ^(Block)(int,int);
Block  b1;   //Block 是一个类型




block访问外部变量


block内部可以访问block外部的变量将外部变量的值以const方式拷贝一份到block所在的内存中  一个新的内存空间变量




block内部
不允许修改外部的变量


 __block int m =10; //栈区地址


void(^myBlock)()=^{
m=100; //__block不再以const的方式拷贝,允许修改  修改的还是copy后block空间内部的变量




};
%d%p,m,&m
block运行后m的地址和值是在block更改之后的值和地址。






静态变量和全局变量 在加不加__block都会直接引用变量地址,也就意味着可以修改变量的值,在没有加__block参数的情况下。
堆 block 是对block copy得来,对全局block copy不会有任何作用返回的依然是全局block
全局block 定义在函数外面的block是global的;另外如果函数内部的block,但是没有捕获任何自动变量,那么他也是全局的。
栈block 区别为是否引用了外部变量






常量变量————不加__block类型block会引用常量的地址(浅copy)加__block类型block会去引用常量变量的地址。  










block应用场景


void work (void (^workBlock())//block类型的变量workblock作为函数的参数
{






}


typedef void (^workBlock)();
workBlock w;
w=^{
NSLog(@"sdffdsfsf");
}




作为函数返回值


workBlock test(){


}




block使用技巧和注意


1.block助记符
inlineblock 快捷创建block




点击xcode右下角{}按钮
之后将你想快捷的代码选中之后往{}下的区域拖拽
编辑Completion shortcut  也就是助记符字母






之后将 类型选中 改成<#type#> 变量名 改成<#name#>


删除选中助记符 按delete键




2.我们在定义block变量的时候,形参类型及个数 这个位置处可以
加上形参名称


void test (int(^block)(int x,int y)){


}


test之后回车就会自动填充两个变量 xy




protocol概念及基本使用


协议的使用流程:
定义协议
在类中采用指定的协议
实现协议中的方法(注意方法有必须实现和选择实现两种)




定义协议
.h文件中


采纳协议
ClassA.h中,类声明的时候采纳协议


ClassA.m文件中 实现协议对应的方法




定义协议


@protocol 协议名称<NSObject>// 默认遵守NSObject协议
方法声明列表
@end


类遵守协议


@interface 类名:父类<协议名称>
一个类可以遵守 一个协议或者多个协议
多个协议用逗号隔开




使用协议的流程
定义协议
让类遵守这个协议
实现协议中对应的方法(必须要实现的)


遵守协议步骤


1 导入头文件
#import "baseprotocol.h"
遵守协议
@interface Person:NSObject<baseProtocol>
实现方法
在 .m中去实现


结论:当我们遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明


3父类遵守了某个协议 子类也遵守


4protocol声明的方法可以被任何类实现


5OC不能多继承多个类 但是一个类可遵守多个协议
6基协议<NSObject>


7协议可以遵守协议


protocol基协议
NSObject是一个基类,最根本也是最基本的类,任何其他类最终都要继承它,他还有个名字叫NSObject的协议,他是一个协议最根本最基本的协议


NSObject协议中声明很多基本的方法


description
retain
release


建议每个新的协议都遵守NSObject协议






protocol中@required和@optional用法


用于控制方法是否要实现(默认是@required)
在大多数情况下,用途在于程序员之间的交流


@required 这个方法必须要实现 不实现发出警告


@optional表示选择实现的方法




protocol类型限制


增加类型限制
第一种类型限制给id类型增加限制
id<houseHold> obj=d;
表示obj只能赋值遵守了houseHold协议的对象


第二种类型限制
表示obj2赋值的时候必须是Girl对象,并且遵守了houseHold协议
Girl<houseHold> *obj2=d;


第三种类型限制
obj2.dog=d;
@property (nonatomic,strong)Dog<dui> *dog;// 对狗类型的要求<>


instancetype能精确的限制返回类型




protocol代理设计模式引入


第一步制定协议


第二步创建相关的类




baby.m
[self.bm feedBabyEat:self];
baby.h
@property (nonatomic,strong)BaoMu<lookBabyProtocol> *bm;




protocol代理设计模式


自己做不了让别人去做










MVC 
model 模型
view 视图
controller 控制器




代理模式概念
传入的对象,代替当前类完成某个功能,称为代理模式


利用协议实现代理模式的主要思路为
1.定义一个协议,里面声明代理类需要实现的方法列表,比如一个代理类需要实现feed与honghaizi方法
2.创建一个代理类,遵守上边的协议
3.在于鏊代理类中,定义一个对象类型为id且遵守代理协议的成员变量
4.在baby类中调用成员变量__delegate(代理)的方法,调用代理类的方法
5.main.m或其他使用baby类的文件中,为baby类的成员变量(代理类)赋值




应用场合


1监听器的场合


2.通知的场合


3.有些事情不想自己处理,想交给别人处理




代理类 LinkHome
代理对象 delegate
协议 findHouseProtocol
协议内容 findHouse

Foundation框架介绍


框架是由许多类,方法,函数,文档按照一定的逻辑组织起来的集合。以便使研发程序变得更容易在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架为Foundation框架


处理日期和对象,内存管理,处理文件系统,存储对象,处理集合数据结构


Cocoa是Foundation和AppKit
Cocoa Touch是Foundation和UIKit


Foundation框架中大约有125个可用的头文件






Foundation框架的作用


Foundation框架是Mac\iOS中其他框架的基础
Foundation框架包含常见的数据类型


如果修改了系统的文件


缓存路径为/Users/用户名/Library/Developer/Xcode/DerivedDate
显示指令文件 defaults write com.apple.finder AppleShowAllFils -bool true


隐藏指令文件 defaults write com.apple.finder AppleShowAllFils -bool false




输入指令后重启Finder



























































































































































































































































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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值