黑马程序员——OC之ARC、Block、Protocol
2015-04-16 22:17
411 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化。
判断标准
ARC的判断准则:只要没有强指针指向对象,就会释放对象。
特点
1、不允许调用release、retain、retainCount;
2、允许重写dealloc,但是不允许调用[super dealloc];
3、@property的参数
strong :成员变量是强指针(适用于OC对象类型)
weak :成员变量是弱指针(适用于OC对象类型)
assign : 适用于非OC对象类型
4、retain改为用strong。
如下程序所示:
在默认的情况下,多有的指针都是强指针__strong,弱指针的表示为__weak。
在之前的内存管理中,我们提到过循环引用,即:
为了解决内存泄露,我们可以将其中一个retain改为assign就可以解决这个问题。但是在ARC中我们不使用retain,这时候一段用strong,一段用weak同样可以解决这个问题。
Block的标志为:^。它和函数很像,可以保存代码,有返回值有形参,同时调用方式也相同。
定义block变量
我们采用如下的方式来定义block变量
也可以写成:
封装代码
如果block没有形参,后面的括号可以省略,上面的程序可以简化成:
访问变量
上面的程序中a是不能进行赋值的,因为在默认情况下,block内部是不能修改外边的局部变量的,但是NSLog可以进行输出,因为block内部可以访问外面的变量,如果给局部变量加上__block关键字,这个局部变量就可以在block内部修改。
利用typedef定义block类型
为了方便定义,我们采用typedef对block类型进行定义,可以这么编写:
然后我们就可以利用MyBlock这种类型来定义block变量,这其实和我们C语言中指向函数的指针类似。
协议的定义
代码中的NSObject,是一个基协议,最根本最基本的协议,就如同NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它。NSObject协议中声明很多最基本的方法,比如description、retain、release等,每个新的协议在没有明确要求的情况下,都要遵守NSObject协议。
如何遵守协议
1、类遵守协议
2、协议遵守协议
协议中方法声明的关键字
1、@required
要求实现,如果没有实现,会发出警告,默认情况下新声明的方法都是这个类型。
2、@optional
不要求实现,也不会有警告。
这些关键字在我们编程时基本不会使用,但是对于程序员之间的交流提供了便利。
变量对协议的遵守
定义一个变量的时候,我们可以限制这个变量保存的对象遵守某个协议,有两种方法可以实现:
类名<协议名称> *变量名;
id<协议名称> 变量名;
如果没有遵守对应的协议,编译器会发出警告。
@property中声明的属性也可用做一个遵守协议的限制
在这个模式的设计中我们需要注意的几点。
第一、代理必须遵守一个代理协议,代理协议包括代理所需要做的事情,即方法。这样在我们更换新代理的同时不需要重新编写方法,只需要新代理遵守这个协议即可。
第二、在Person的声明中我们采用id来代替类名,id属于万能指针,这样就避免了当更换新代理的同时修改类名。
如下:
到这里我们已经学习了OC所有的语法,但是知识需要不断的消化吸收,我们只是将只是了解了一遍,还需要更多的代码来加深我们对知识的理解。
——Java培训、Android培训、iOS培
92cd
训、.Net培训、期待与您交流! ——-
ARC
之前我们说了OC中的内存管理,很繁琐而且不易管理。ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切。ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化。
判断标准
ARC的判断准则:只要没有强指针指向对象,就会释放对象。
特点
1、不允许调用release、retain、retainCount;
2、允许重写dealloc,但是不允许调用[super dealloc];
3、@property的参数
strong :成员变量是强指针(适用于OC对象类型)
weak :成员变量是弱指针(适用于OC对象类型)
assign : 适用于非OC对象类型
4、retain改为用strong。
如下程序所示:
@property (nonatomic, strong) NSString *name; @property (nonatomic, assign) int age;
在默认的情况下,多有的指针都是强指针__strong,弱指针的表示为__weak。
在之前的内存管理中,我们提到过循环引用,即:
p.card = c; c.person = p;
为了解决内存泄露,我们可以将其中一个retain改为assign就可以解决这个问题。但是在ARC中我们不使用retain,这时候一段用strong,一段用weak同样可以解决这个问题。
Block
Block即代码封装,它可以将一段代码封装,并且可以在任何时候执行,它可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。Block的标志为:^。它和函数很像,可以保存代码,有返回值有形参,同时调用方式也相同。
定义block变量
我们采用如下的方式来定义block变量
int (^MyBlock)(int, int); void (^MyBlock)();
也可以写成:
int (^MyBlock)(int, int) = ^(int a, int b){ return a + b; };
封装代码
^(int a, int b){ return a - b; };
^(){ NSLog(@"_________"); };
如果block没有形参,后面的括号可以省略,上面的程序可以简化成:
^{ NSLog(@"_________"); };
访问变量
void test() { int a = 10; __block int b = 20; void (^block)(); block = ^{ NSLog(@"a = %d", a); // a = 20; b = 25; }; block(); }
上面的程序中a是不能进行赋值的,因为在默认情况下,block内部是不能修改外边的局部变量的,但是NSLog可以进行输出,因为block内部可以访问外面的变量,如果给局部变量加上__block关键字,这个局部变量就可以在block内部修改。
利用typedef定义block类型
为了方便定义,我们采用typedef对block类型进行定义,可以这么编写:
typedef int (^MYBlock)(int , int);
然后我们就可以利用MyBlock这种类型来定义block变量,这其实和我们C语言中指向函数的指针类似。
MyBlock block; MyBlock b1, b2; b1 = ^(int a, int b){ return a - b; }; MyBlock b3 = ^(int a, int b){ return a - b; };
Protocol
protocol即协议,它可以用来声明一大堆方法(不能声明成员变量),只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明,同时,只要是父类遵守了这个协议,就相当于子类也遵守了。协议的定义
@protocol 协议名称 <NSObject> // 方法声明列表…… @end
代码中的NSObject,是一个基协议,最根本最基本的协议,就如同NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它。NSObject协议中声明很多最基本的方法,比如description、retain、release等,每个新的协议在没有明确要求的情况下,都要遵守NSObject协议。
如何遵守协议
1、类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2> @end
2、协议遵守协议
@protocol 协议名称 <协议名称1, 协议名称2> @end
协议中方法声明的关键字
1、@required
要求实现,如果没有实现,会发出警告,默认情况下新声明的方法都是这个类型。
2、@optional
不要求实现,也不会有警告。
这些关键字在我们编程时基本不会使用,但是对于程序员之间的交流提供了便利。
变量对协议的遵守
定义一个变量的时候,我们可以限制这个变量保存的对象遵守某个协议,有两种方法可以实现:
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj; id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会发出警告。
@property中声明的属性也可用做一个遵守协议的限制
// @property (nonatomic, strong) 类名<协议名称> *属性名; @property (nonatomic, strong) Dog<MyProtocol> *dog; // @property (nonatomic, strong) id<协议名称> 属性名; @property (nonatomic, strong) id<MyProtocol> dog;
代理设计模式
有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做。在这个模式的设计中我们需要注意的几点。
第一、代理必须遵守一个代理协议,代理协议包括代理所需要做的事情,即方法。这样在我们更换新代理的同时不需要重新编写方法,只需要新代理遵守这个协议即可。
第二、在Person的声明中我们采用id来代替类名,id属于万能指针,这样就避免了当更换新代理的同时修改类名。
如下:
@property (nonatomic, strong) id<TicketDelegate> delegate;
到这里我们已经学习了OC所有的语法,但是知识需要不断的消化吸收,我们只是将只是了解了一遍,还需要更多的代码来加深我们对知识的理解。
——Java培训、Android培训、iOS培
92cd
训、.Net培训、期待与您交流! ——-
相关文章推荐
- 黑马程序员_OC_ARC,block,protocol
- 黑马程序员——OC学习小结------arc,block,protocol(协议)
- 黑马程序员——OC语言学习——ARC机制、block代码块、protocol协议、protocol协议的应用
- 黑马程序员 OC基础: Block 和 Protocol
- 黑马程序员————OC语言BLOCK和Protocol总结
- 黑马程序员——OC热身——Category、Protocol、Block、常用结构体
- 黑马程序员——OC基础---block,protocol
- 黑马程序员——OC基础:block和Protocol及Category
- 黑马程序员-iOS基础之OC重点语法(Block、Protocol)
- 黑马程序员——OC语言------Block、protocol协议、代理设计
- 黑马程序员——OC—block和protocol协议
- 黑马程序员-OC-block和protocol
- 黑马程序员——OC语言基础篇---block和protocol
- OC-ARC机制、数据类型block、 protocol协议、Foudation框架
- OC_语法入门_day6_ARC(循环引用)/block代码块(闭包)/protocol协议(接口)/代理模式
- 黑马程序员_OC_block和protocol协议
- 黑马程序员---OC基础---Block、分类Category、协议protocol
- 黑马程序员——OC基础---Block、protocol
- 黑马程序员—— OC加强---ARC+Category+Block
- 黑马程序员_OC学习之block、protocol、categories