函数指针别名

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

黑马程序员————第三天相关推荐

  1. 黑马程序员—专题三:黑马学院周边环境——睁大你的眼睛看清楚哦

    文章来源:黑马程序员,黑马论坛        近期好多学员都强烈的想知道黑马训练营周边的环境如何,为了满足大家的期望,我跋山涉水,跑遍了整个软件园请了我们的阿海老师照下了软件园的全景,保证大家看了绝对 ...

  2. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第三章 课后答案

    所有章节答案合集-->传送门 [测一测] 学习完前面的内容,下面来动手测一测吧,请思考以下问题: 1.请列举Servlet接口中的方法,并分别说明这些方法的特点及其作用. 2.简述Servlet ...

  3. 黑马程序员 高新技术三 注解和泛型

    ----------android培训 java培训 期待与您交流! ---------- 第一节 了解和入门注解的应用 一.概述: 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没 ...

  4. 【传智播客】Javaweb程序设计任务教程 黑马程序员 课后答案【合集】

    [传智播客]Javaweb程序设计任务教程 黑马程序员 第一章 课后答案 [传智播客]Javaweb程序设计任务教程 黑马程序员 第二章 课后答案 [传智播客]Javaweb程序设计任务教程 黑马程序 ...

  5. 黑马程序员C语言基础(第三天)

    黑马程序员C语言基础(一)第三天 https://www.bilibili.com/video/BV15W411K7k6?p=40 文章目录 低级语言与高级语言 c语言优缺点 c语言应用领域 通过gc ...

  6. 黑马程序员C++学习笔记(第三阶段核心:STL)--- 更新中

    目录 迭代器 序列式容器 vector -- 可随机访问 list -- 不支持随机访问 deque -- 动态 关联式容器 -- 红黑树 map multimap set multiset -- 废 ...

  7. 梦想在三十岁起航!__来自黑马程序员69期安卓班的学员

        梦想在三十岁起航! 多久没动笔了?恐怕我也记不起来了,在生活不如意的时候也曾想写点什么,可是却又全然没有思路,曾经的文思泉涌,早已在长时间浑浑噩噩的工作生活中干涸了,而今宛如仲永一般,泯然众人 ...

  8. 黑马程序员Java教程学习笔记(三)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...

  9. Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)

    Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 三.第三阶段 C++提高编程 介绍C++泛型编 ...

最新文章

  1. Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10
  2. LeetCode简单题之唯一摩尔斯密码词
  3. Android Read-only file system
  4. python和vb的代码可以通用吗-VB6+Python混合编程(COM组件)(转)
  5. Android --- no module 问题
  6. Linux没有安装gcc如何在线安装(直接在Linux终端安装)
  7. 了解如何解决OSGI捆绑包
  8. Python二级笔记(14)
  9. Flutter获取随机数 Dart语言核心基础
  10. java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException
  11. android brvah 分组,RecyclerView使用BRVAH完成分组布局效果
  12. Unity游戏开始界面制作教学
  13. 博科 5300 光纤交换机配置 备份和恢复
  14. Ubuntu 18安装搜狗拼音
  15. 三层交换机的工作原理
  16. web3py earliest、latest、pending
  17. 安装监控的地方没有WiFi,没有无线网络,如何实现远程监控?
  18. python微信群聊机器人_Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)...
  19. 海尔系列报道之一:海尔“小微”怎么玩
  20. 杭电选课脚本(一)登录选课系统

热门文章

  1. EMLOG模板eMedia媒体范儿
  2. 静态网页与动态网页的差异
  3. C语言Qt视图实现彩虹渐变效果,我就问你6不6?
  4. Android自定义Drawable第十四式之百步穿杨
  5. win10系统如何进入BIOS
  6. 《Globally and locally consistent image completion》图像修复论文解读
  7. navicat 关于orcale新建表空间,用户和权限分配
  8. 表格数据横向转纵向并在el-table中渲染
  9. godaddy 域名 绑定阿里云服务器 绑定tomcat (.fm的域名可以看看)
  10. python求一组数的最大值_用python实现在一组数据中,寻找到最大数和最小数并输出最大数和最小数所在的位置...