黑马程序员——OC热身——Category、Protocol、Block、常用结构体

——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);//有参数,返回值类型为int
void (^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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值