03 Object-C中的category和block

1、category:分类

在java中,如果想要扩展某一个类的,最直接的方法就是采用继承的方式,但是,继承有个最大的弊端就是耦合度实在是太高,在大型项目中,写到后面都有种想死的心都有,只要父类改变了一点点功能,就得去检查是否会影响到子类。所以在实际开发中尽量少用继承这种方式,一般会采用装饰等其他方式来避开继承。
object-c中,设计出了category这个机制,对于扩展类的功能来说,比起继承来说,也算是一个较大的改进了。

2、block

一种数据类型,类似于匿名函数或是javascript中的闭包吧

//
//  Calculate.h
//  IOS_Study_Sample
//
//  Created by luozheng on 2018/1/26.
//  Copyright © 2018年 luozheng. All rights reserved.
//

#import 

@interface Calculate : NSObject

typedef int (^calculateBlock) (int,int);

-(int)calculate:(int)num1 num2:(int)num2 block:(calculateBlock)cal;

@end


//
//  Calculate.m
//  IOS_Study_Sample
//
//  Created by luozheng on 2018/1/26.
//  Copyright © 2018年 luozheng. All rights reserved.
//

#import "Calculate.h"

@implementation Calculate

-(int)calculate:(int)num1 num2:(int)num2 block:(calculateBlock)cal
{
    return cal(num1,num2);
}

@end


//
//  main.m
//  04-block测试
//
//  Created by luozheng on 2018/1/26.
//  Copyright © 2018年 luozheng. All rights reserved.
//

#import 
#import "Calculate.h"

NSString* hello(int i)
{
    //NSLog(@"hello 999999999999999");
    return [NSString stringWithFormat:@"hello 999999999999999 %d",i];
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // myHello是一个指向函数的指针,最前面是返回值,注意返回值不要使用括号
        NSString* (*myHello)(int) = hello;
        NSString* result = myHello(100);
        NSLog(@"result = %@",result);
        
        // block类似于函数指针,唯一的不同就是函数不用在外面单独写了
        NSString* (^myBlock) (int) = ^ NSString* (int i) {
            return [NSString stringWithFormat:@"hello 666666666666 %d",i];
        };
        NSString* blockResult = myBlock(888);
        NSLog(@"blockResult = %@",blockResult);
        
        // block作为参数传给方法
        int (^sumBlcok)(int,int) = ^ int (int num1,int num2){
            return num1 + num2;
        };
        
        Calculate *calculate = [[Calculate alloc] init];
        int sum = [calculate calculate:20 num2:68 block:sumBlcok];
        NSLog(@"sum result = %d",sum);
    }
    return 0;
}


3、protocol:协议,这个直接理解成interface就行。
4、SEL 数据类型:指向方法的一个指针

没有啥可多说的,有个问题看看原因和处理方法就行。
performSelector may cause a leak because its selector is unknown

//
//  main.m
//  05-protocol测试
//
//  Created by luozheng on 2018/1/26.
//  Copyright © 2018年 luozheng. All rights reserved.
//

#import 
#import "Button.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Button * button = [[Button alloc] init];
        
//        [button onCreate];
//        NSLog(@"Button name = %@",[button name]);
//        [button onDestroy];
        
        SEL s1 = @selector(onCreate);
        [button performSelector:@selector(onCreate)];
        [button performSelector:NSSelectorFromString(@"onCreate")];
    }
    return 0;
}

你可能感兴趣的:(03 Object-C中的category和block)