黑马程序员——OC热身——Category、Protocol、Block、常用结构体
来源:互联网 发布:淘宝网电脑旺旺打不开 编辑:程序博客网 时间:2024/06/06 02:25
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
分类(Category)
可以动态的为已经存在的类添加新的方法,并且不需要继承。
分类只能扩展方法,不能增加成员变量。
命名规则:类名+扩展方法
#import "Student.h"// ()代表是一个分类// ()中的Test代表着分类的名称@interface Student (Test)- (void)test;@end
应用场景
1. 对现有类进行扩展:比如,可以进行扩展Cocoa touch框架中类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。2. 作为子类的替代手段,不需要定义和使用一个子类,你可以通过类别直接向已有的类别中增加方法。3. 对类中的方法进行归类,利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。
协议(Protocol)
一系列方法的列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式。类似于java中的接口。
用来声明一大堆的方法(不能声明成员变量),不能写实现。
只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
只要父类遵守了某个协议,那么子类也遵守。
OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
NSObject是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
定义协议
// <> 代表实现某个协议@protocal ButtonDelegate <NSObject>//@required必须实现的方法//虽然字面上说是必须实现,但是编译器并不强求某个类进行实现//默认必须实现@required- (void)onClick;//@optional表示可选(可实现、也可以不实现)@optional- (void)test;@end@interface Button : NSObject//delegate 就是按钮的监听器@property(nonatomic, retain) id<ButtonDelegate> delegate;@end
@required (默认)要求实现,若没有实现则警告但不报错。
@optional 不要求实现
实现协议
//对协议进行提前声明,跟@class的用途是一致的@protocol ButtonDelegate;@interface ButtonListener : NSObject <ButtonDelegate>@end
@import "Button.h"@implementation ButtonListener- (void)onClick{ NSLog(@"按钮被点击了");}@end
判断某个类有没有实现某个协议或者方法
//conformsToProtocol:判断是否遵守了某个协议BOOL isOk = [stu conformsToProtocol:@protocol(Study)];//respondsToSelector:判断是否遵守了某个方法isOk = [stu respondsToSelector:@selector(test)];
补充:协议本身写在.h头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。
Block
Block封装了一段代码,可以在任何时候执行。
Block和函数的相似性
1. 可以保存代码。2. 有返回值.3. 有形参。4. 调用方式一样。
定义BLOCK变量
int (^SumBlock)(int,int);//有参数,返回值类型为intvoid (^MyBlock)();//无参数,返回值类型为空
//定义了MySum这种block类型typedef int (^MySum) (int,int);int main(){ //定义了一个block,这个block的返回值是int类型,接收两个int类型的参数 int (^Sum) (int,int) = ^(int a, int b){ return a+b; }; int a = Sum(10,11); //如果外部变量用了__block关键字,就可以在block内部修改这个变量 __block int c = 19; //声明了一个block变量 MySum sum = ^(int a,int b){ c = 29; return a+b; }; int b = sum(10,10); return 0;}
小结
1. block内部可以访问外部变量。2. 默认情况下,block内部不能修改外部的局部变量。3. 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。4. 利用typedef定义block类型(和指向函数的指针很像)。 typedef int(^MyBlock)(int ,int); 以后就可以利用这种类型来定义block变量了。 MyBlock a; a=^(int a,int b){return a-b;}; MyBlock b=^(int n1,int n2){ return n1*n2; };
–Foundation框架–
常用结构体
NSRange
表示事物的一个范围,通常是字符串里的字符范围或者集合里的元素范围。
location表示该范围的起始位置
length表示该范围内所含的元素个数
NSRange range = NSMakeRange(7,3);NSString *str = NSStringFormRange(range);
NSPoint
代表一个点
NSPoint p = NSMakePoint(7,3);p = CGPointMake(10,20);NSString *str = NSStringFormPoint(p);
NSSize
表示物体的尺寸
NSSize size = NSMakeSize(100,200);size = CGSizeMake(400,800);NSString *str = NSStringFormSize(size);
NSRect
表示物体的尺寸和位置
NSRect rect = NSMakeRect(10,10,80,80);rect = CGRectMake(20,20,100,100);NSString *str = NSStringFormRect(rect);
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
0 0
- 黑马程序员——OC热身——Category、Protocol、Block、常用结构体
- 黑马程序员——OC基础:block和Protocol及Category
- 黑马程序员——OC的Category和Protocol
- 黑马程序员—— OC加强---ARC+Category+Block
- 黑马程序员——OC之Category、Block
- 黑马程序员——OC基础学习(五)---分类(Category),代码块Block和protocol代理设计模式
- 黑马程序员——OC—block和protocol协议
- 黑马程序员——OC基础04—block、protocol
- 黑马程序员——OC语法 block和protocol
- 黑马程序员——OC之ARC、Block、Protocol
- 黑马程序员——OC基础---block,protocol
- 黑马程序员——OC基础---Block、protocol
- 黑马程序员员—OC(block和protocol)
- 黑马程序员——ios知识整理——category、block、protocol
- 黑马程序员---OC基础---Block、分类Category、协议protocol
- 黑马程序员——OC热身——NSString、NSMutableString
- 黑马程序员——block与protocol
- 黑马程序员——OC---protocol
- 处理Xcode 警告
- thinkphp 学习之表单数据智能写入 create 方法
- java生成不重复的随机数【某个范围0-10】或者【某个数组int[1,3,56,14,26,22,17]】
- 基于XMPP协议的手机多方多端即时通讯方案
- 比Redis更快:Berkeley DB面面观
- 黑马程序员——OC热身——Category、Protocol、Block、常用结构体
- lseek及llseek介绍
- 习题2—8
- linux下使用supervisor监控应用程序
- 第三次作业
- Android禁止输入框控件EditText弹出软键盘
- 准确理解CSS clear:left/right的含义及实际用途
- Palindrome Partitioning I II
- sqlite与coreData的简单比较