黑马程序员——ios基础---Objective-C:ARC、类别、Block、协议
来源:互联网 发布:手机淘宝积分怎么领 编辑:程序博客网 时间:2024/05/21 16:54
一、ARC
1、ARC:在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和 autorelease三个关键字就好~这是ARC的基本原则。
2、ARC的判断原则:
只要还有一个强指针变量指向对象,对象就会保持在内存中。
只要没有强指针指向对象,对象就会被释放。
注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了
3、循环strong问题 :循环引入的对象都为strong;
解决方案:
循环引入的对象中其中一个对象设置为strong 另一个设置为weak
4、ARC特点总结
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
assign:适用于非OC对象类型(基础类型)
在ARC下 @property set方法参数
原子性\读写和MRC下是一样的
MRC
ARC
assign
assign
retain
strong(强指针)OC其他的对象 weak(弱指针) UI控件
copy
copy
5、ARC使用注意事项
1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。
2)__weakPerson *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil。
__weak Student *stu = [Student new];
//1 Student new
// 产生空间
//2 弱指针 stu 指向
//弱指针指向对象销毁的过程
//1) 释放对象空间
//2)stu = nil
3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再
[super dealloc]。
@property(nonatomic,strong)Dog *dog;
// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
4)如果换成是弱指针,则换成weak,不需要加_ _。
二、Category分类
1、分类的作用: 将一个类中的不同方法分到多个不同的文件中存储, 便于对类进行模块化设计、团队合作 开发。
2、可以在不修改原来类的基础上, 为这个类扩充一些方法.
分类中只能增加"方法", 不能增加成员变量、@property等。
分类可以访问原来类中的成员变量
主类与分类中方法的调用优先级问题:
1) 当分类与主类中都有同一个方法的时候, 优先调用分类中的方法。
2) 当多个分类中都有同样的一个方法的时候, 优先调用最后一个参与编译的分类中的方法。
3、类扩展(匿名分类)
1)类扩展是写在.m文件中的, 为当前类扩展一些私有的成员.
2)作用: 为某个类扩充一些私有的成员变量和方法.
3)"类扩展"对比"分类", 就少了一个分类名称,因此也有人称它为"匿名分类".
4、声明和实现一个类别
在.h文件中,声明类别:
@interface ClassName(CategoryName)
NewMethod; //在类别中添加方法
//不允许在类别中添加变量
@end
说明:
声明类别格式
1)新添加的方法必须写在 @interface 与@end之间
2)ClassName 现有类的类名(要为哪个类扩展方法)
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法
5、注意:
1)不允许在声明类别的时候定义变量
在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
NewMethod
{
...... }
@end
说明:
实现类别格式
1)新方法的实现必须写在@implementation与@end之间
2)ClassName 现有类的类名
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法的实现
6、调用类别中的方法
调用类别中的方法
与一般成员方法调用形式,完全一样
需要包含类别的头文件
7、分类的使用注意事项
1)分类只能增加方法,不能增加成员变量、@property(可能编译不报错,但是运行有问题)
2)分类可以访问原来类中的成员变量
3)如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略
8、总结:
1,如果分类中有和类本身同名的方法,优先会调用分类中的同名方法;
2,如果多个分类中有同名的方法,执行哪个分类的方法,取决于编译的顺序,最后编译的那个分类中的方法会执行。
三、 block
1、block是一种数据类型, 可以使用这种数据类型定义变量, 并赋值。
block数据类型在使用前需要先定义该数据类型, 然后再使用(就像使用Person类一样, 先
定义一个Person类, 然后再通过Person类声明一个Person类型变量)。
block这种数据类型用来保存一个方法、函数、一段代码
使用inlineBlock辅助编写block代码
int (^block)(int,int) = ^(int n, int m){};
2、block的基本概念
Block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,Block对象包含着一组状态数据, 这些数据在程序执行时用于对行为产生影响。
你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程。 作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要 的数据。
3、block的基本用法
用^操作符来声明一个Block变量,并指明Block述句的开始。Block的主体部分包含在{}内,像下面的例子中一样(与C语法一样,“;”指明语句的结束):
4、block的typedef
可以使用typedef定义一个Block的类型,便于在后续直接使用
格式: typedef 返回值类型 (^block变量名)(参数类型列表);
5、block访问外部变量
1)在block内部可以访问block外部的变量
block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域
2)在block内部不可以修改block外部的变量
默认情况下,Block内部不能修改外部的局部变量
给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
6、block作为函数的返回值
步骤: 1)使用typedef定义一个新的类型
//给block起一个别名
typedef int(^newType)(int num1,int num2);
2)使用新类型作为函数的返回值
//定义一个返回值是block类型的函数
newType test4()
{
//定义一个newType 类型的block变量
newType work1=^(int x,int y)
{
return x+y;
};
return work1;
}
3)定义变量接收函数返回的值(block类型)
4)调用block
7、block和函数的区别:
1)定义方式不一样;
2)block是一种数据类型;
3)函数不可以嵌套使用,block可以嵌套使用;
4)block因为是数据类型,所以可以作为函数的参数和返回值;
5)函数则不可以作为函数的参数或者返回值。
三、协议
1、protocol的使用流程
1)定义协议
协议的定义
@protocol 协议名称 <NSObject>
//方法声明列表
@end;
注意:协议默认的要采纳NSObject的协议
2)采纳协议
1>类遵守协议
创建类的时候遵守某个或者某几个协议
@interface 类名 :父类 <协议名称>
@end
//默认遵守NSObject协议
@interface 类名 :父类 <协议名称1,协议名称2>
@end
某个协议也遵守某个或者某些协议,一个协议可以遵守其他多个协议,
2>协议遵守协议
@protocol 协议名称 <其他协议名称>
@end
多个协议之间用逗号 , 隔开。
@protocol 协议名称 <其他协议名称1, 其他协议名称2> @end
实现协议中的方法
2、protocol的使用注意
OC中的协议(protocol)使用注意:
1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
2)只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
3)只要父类遵守了某个协议,那么子类也遵守。
4)Protocol声明的方法可以让任何类去实现,protocol就是协议。
5)OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
6)基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
7)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明
8)协议之间可以有继承关系
使用Protocol时还需要注意的是:
1>protocol也可以采纳其他的协议,比如:
@protocol A
-(void)methodA;
@end
@protocol B <A>
-(void)methodB;
@end
如果你要遵守B协议,那么methodA和methodB都需要实现
2>类如果采纳协议后,实现了协议的方法,这些方法可以被子类继承
比如:
Person类采纳了Run和Work两个协议,并实现了两个方法
3、protocol基协议介绍
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它,它还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法
description
Retain
release
建议每个新的协议都要遵守NSObject协议
4、protocol中@required和@optional
@required和@optional是协议方法声明中的两个关键字他们主要用于控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@optional这个方法不一定要实现
5、protocol代理设计模式概念
代理模式概念
传入的对象,代替当前类完成了某个功能,称为代理模式
利用协议实现代理模式的主要思路为:
1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现 feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值,比如
6、protocol代理模式应用场合
代理设计模式的场合:
当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
当对象A无法处理某些行为的时候,想让对象B帮忙处理 (让对象B成为对象A的代理对象)
- 黑马程序员——ios基础---Objective-C:ARC、类别、Block、协议
- 黑马程序员--Objective-C——ARC
- Objective-C—autorelease、ARC、block、protocol(协议)
- 黑马程序员——Objective-C中的Category(类别)——黑马 IOS 技术博客
- Objective-C---ARC、block、协议
- 黑马程序员—Objective-C基础_block、协议
- 黑马程序员——ios基础---Objective-C:基础语法
- 黑马程序员——ios基础---Objective-C:Foundation
- 黑马程序员---iOS基础---OC中的ARC、分类、block
- objective-c---ARC、block、协议(protocol)
- 黑马程序员-iOS基础-Objective-C基础(七)block和protocol
- 【黑马程序员】iOS学习之路——Objective-C之protocol和block
- 黑马程序员——Objective-C的内存管理MRC与ARC——黑马 IOS 技术博客
- 黑马程序员—Objective-C学习—block和protocol
- 黑马程序员--Objective-C——Block与@protocol
- 黑马程序员——Objective--C笔记Category、block
- 黑马程序员---Objective-C Block
- 黑马程序员--iOS--Objective-C基础 (一)
- log4cpp之快速入门
- static作用(修饰函数、局部变量、全局变量)
- 斯坦福大学自然语言处理第二课“文本处理基础(Basic Text Processing)”
- Python模块(functools)
- 【使用JSOUP实现网络爬虫】获取所有链接
- 黑马程序员——ios基础---Objective-C:ARC、类别、Block、协议
- Hdoj 5410 CRB and His Birthday【背包变形】
- kafka学习(一)
- mysql中的Group by与having理解
- POJ 2425 && HDU 1524 A Chess Game(博弈论)
- Java多线程 -- 生产者消费者模型
- zeroconf介绍
- 华为oj: 图片整理
- 程序在的内存中的分配(常量,局部变量,全局变量,程序代码)