发布于 2015-12-28 02:17:20 | 222 次阅读 | 评论: 0 | 来源: 分享

这里有新鲜出炉的Objective-C教程,程序狗速度看过来!

Objective-C 编程语言

Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在GCC以及Clang运作的系统上编写和编译,因为GCC与Clang含Objective-C的编译器。 1980年代初布莱德·确斯(Brad Cox)在其公司Stepstone发明Objective-C。他对软件设计和编程里的真实可用度问题十分关心。Objective-C最主要的描述是 他1986年出版的Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.


在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block。感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道。如果 读者之前用过SSH框架的话,看到OC中的Block回调,会感觉非常的亲切,和Java中的接口回调像极了。还是那句话,上些Block的回调代码最为直接。下面的demo是根据笔者的理解,自己设计的一个小小的Block回调的 demo,难免会有不足之处,还望批评指正,尊重原创,转载请注明出处。

为了实现我们的Block回调,我们需要模拟一个组件(Component)和一个控制器(Controller)。在Component中我们只给出代码块的声明,不进行实现,然后在Controller中进行实现,在Component中进行调用,也就是说由组件提供代码块的形式和代码块的参数,在Controller中给出业务逻辑。可能有的小伙伴看完上面的功能描述多少会有些抽象,废话少说,代码 走起!

1.为了更好的理解,我们就先写组件的接口部分,接口部分需要给出代码块的定义和声明,然后再提供一个外部代码块的入口函数,相当于前面目标方法回调的注册方法,再提供一个执行代码块的方法,组件的接口如下:


//  ComponentBlock.h
//  Memory
//  Created by ludashi on 14-8-19.
//  Copyright (c) 2014年 Mr.li. All rights reserved.
//

#import
//定义Block块类型的变量
typedef void (^BlockType) (NSString *parameter);
@interface ComponentBlock : NSObject

//声明Block类型的变量
@property (nonatomic, strong)BlockType blockDemo;

//接受要回调的代码块,把接受的代码块赋给成员变量blockDemo
-(void)setBlockDemoTest:(BlockType)blockDemo;

//执行代码块的方法
-(void)runBlock;
@end

2.组件的@interface写完我们就开始编写组件的实现部分了,组件的实现部分也挺简单的,就是实现我们在接口中声明的方法,我们在set方法中给block赋值,在runBlock中进行代码块的调用,组件中代码块是调用控制器中的代码块,所以称为代码块的回调,代码如下


#import "ComponentBlock.h"

@implementation ComponentBlock

-(void)setBlockDemoTest:(BlockType)blockDemo
{
    self.blockDemo = blockDemo;
}

-(void)runBlock
{
    self.blockDemo(@"我是组件提供的参数");
}

@end

​3.组件写完以后我们就开始写我们的Controller方法,下面的代码是控制器中的接口部分代码,接口部分只声明了控制器启动的方法,代码如下:


#import
@interface Controller : NSObject
-(void)start;
@end

4.控制器的实现部分是控制器的核心部分,为了实现组件的封装,我们用延展来隐藏我们组件要用到的方法,在延展中声明了我们要使用的组件,然后再实现部分进行组件的初始化和编写组件中要调用的代码块,代码块中的参数由组件提供,而控制器只提供业务逻辑控制,在控制器中我们需要 启动我们要使用的组件,也就是组件中的runBlock方法。代码如下:


#import "Controller.h"
#import "ComponentBlock.h"

//为了实现信息的隐藏我们用延展来声明组件
@interface Controller ()
//声明组件
@property (nonatomic, strong) ComponentBlock *component;
@end

//---------实现----------------

@implementation Controller
//在controller中对组件进行初始化
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.component = [ComponentBlock new];
        //进行代码块的回调
        [self.component setBlockDemoTest:^void (NSString *parameter)
        {
            //打印回调的参数
            NSLog(@"%@", parameter);
        }];
    }
    return self;
}

-(void)start
{
    //调用组件的方法,执行代码块
    [self.component runBlock];
}

@end

​5.Block回调的测试:在mian函数中进行控制器的实例化和启动控制器,代码如下:


@autoreleasepool {

    Controller *controller = [[Controller alloc] init];
    [controller start];

}
return 0;

代码运行结果如下:


2014-08-19 17:29:08.904 OC9-Test1[2249:303] 我是组件提供的参数


​以上是Block回调的小demo,读者可以和前面博客中的委托回调和目标方法回调进行一个对比,具体哪一个好用,就看读者个人所好了。Block是后来苹果公司对OC的扩充,就像PHP5.3以后也支持闭包了一样,在之前封装的组件都是用目标方法回调或委托回调实现的,至于Block回调好在哪,还得亲自使用一下才知道啊。

上面的总结暂且这么说吧,是根据笔者自己的理解所总结的内容,不免有偏颇之处,欢迎批评指正,转载请注明出处。



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务