美文网首页
03 Object-C中的category和block

03 Object-C中的category和block

作者: 紫苓 | 来源:发表于2018-01-26 17:02 被阅读29次
    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 <Foundation/Foundation.h>
    
    @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 <Foundation/Foundation.h>
    #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 <Foundation/Foundation.h>
    #import "Button.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Button<ViewNameProtocol,ViewLifecycleProtocol> * 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

          本文链接:https://www.haomeiwen.com/subject/lmaiaxtx.html