一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?

iOS 码拜 10年前 (2015-05-01) 1096次浏览 0个评论

问题1:block用多了好不好,感觉很高大尚一样。
问题2:里面很多申明使用extern,如申明block.这样一搞。全项目都可以用了。。如果这样,oc类方法都不用了,直接的用extern不久好了?
我自己简单的写了一个demo。如下:
#import “ViewController.h”
#import “TwoVC.h”

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad {
    [super viewDidLoad];
    for (id obj in blockData(@”name”, 32)){
        NSLog(@”obj = %@”,obj);
    }
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(0, 0, 100, 100);
    [btn addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    // Do any additional setup after loading the view, typically from a nib.
}
#pragma mark- 申明
extern NSArray *blockData(NSString * string , NSUInteger age);

NSArray *blockData(NSString * string , NSUInteger age) {
    NSArray *arr = @[string,@(age)];
    return arr;
};
– (void)btnAction
{
    TwoVC *tvc = [[TwoVC alloc] init];
    [self presentViewController:tvc animated:YES completion:nil];
}
==================================================
#import “TwoVC.h”

@interface TwoVC ()

@end

@implementation TwoVC

– (void)viewDidLoad {
    [super viewDidLoad];
    for (id obj in blockData(@”name1″, 322)){
        NSLog(@”obj = %@”,obj);
    }

    // Do any additional setup after loading the view.
}
extern NSArray *blockData(NSString * string , NSUInteger age);
多给点看法,没关系,只是作为一个讨论。

一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
5分
1. block不是随便乱用的,使用block主要是解决回调 。它和delegate的作用差不多,它将delegate中的协议方法以类似“函数指针”的方式来调用,看起来更整洁。

2. extern 的用法等同于c,全局变量的定义。 如

///////Defines.h
#import <Foundation/Foundation.h>

#ifndef DEFINES
#define DEFINES
extern NSString *const kAPIScheme;
extern NSString *const kAPIHost;
extern NSString *const kPusherAPIKey;
#endif

/////////Defines.m
#import "Defines.h"
#pragma mark - API
NSString *const kAPIScheme = @"https";
NSString *const kAPIHost = @"api.xxxxx.com";
NSString *const kPusherAPIKey = @"xxxxx";
一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
本帖最后由 zhangao0086 于 2015-03-26 17:33:16 编辑

block是OC对闭包的实现,我觉得还是很方便的,能省代码,又能把逻辑放在一起。没什么高大尚的,很多语言都支持闭包。
extern和全局变量完全不同的。。。
extern是必备的,如果不用extern,会导致重复定义!.h 是不能用int a;这样的东西, 如果用了的话,这个意思不叫声明,叫定义。 相当于只要引用他的所有地方都会定义一个int a。导致冲突。   正常是在.m里面 int a.  然后在.h中 extern int a;这就是生命。

一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
引用 1 楼 zhanglei5415 的回复:

1. block不是随便乱用的,使用block主要是解决回调 。它和delegate的作用差不多,它将delegate中的协议方法以类似“函数指针”的方式来调用,看起来更整洁。

2. extern 的用法等同于c,全局变量的定义。 如

///////Defines.h
#import <Foundation/Foundation.h>

#ifndef DEFINES
#define DEFINES
extern NSString *const kAPIScheme;
extern NSString *const kAPIHost;
extern NSString *const kPusherAPIKey;
#endif

/////////Defines.m
#import "Defines.h"
#pragma mark - API
NSString *const kAPIScheme = @"https";
NSString *const kAPIHost = @"api.xxxxx.com";
NSString *const kPusherAPIKey = @"xxxxx";

block并不是增加一种回调的选择,闭包可以为部分资源不需要一直存在的(只在有限的时间、作用域内存在)、数据不想被外部访问到(而内部可以访问外部)的这些情况提供一种很好的处理机制。
比较典型的就是网络回调,既不需要长时间占用资源、也不需要外部访问闭包的变量。除此之外,把需要重复执行的代码写成方法内的方法(特别是以前做js的时候,这酸爽…),既可以避免把其他地方用不到方法的公开出去,还能省去很多参数传递的麻烦 ,甚至能模拟面向对象的特性

一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
2分
就是C里的回调函数而已, *符号改成^就是。你也可以使用delegate只不过麻烦点而已。

至于extern 最好不要太多吧, 不然多了 自己都乱了

一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
引用 4 楼 z8323664 的回复:

就是C里的回调函数而已, *符号改成^就是。你也可以使用delegate只不过麻烦点而已。

至于extern 最好不要太多吧, 不然多了 自己都乱了

这个不是要不要的问题,你要理解extern解决的是什么问题,申明可以多次,但是定义必须只能有一个

一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
那如果这样,那我可以把项目中所有的公共方法,如:UIview的类方法 ,UIviewController的类方法都放在一个NSObject 类中,然后用以下这种类型写:
extern NSArray *blockData(NSString * string , NSUInteger age);

NSArray *blockData(NSString * string , NSUInteger age) {
    NSArray *arr = @[string,@(age)];
    return arr;
};
然后其他类如果想用只需要在这个类中加一个 extern NSArray *blockData(NSString * string , NSUInteger age);声明就好了。然后直接可以调用对应的方法。这样会灵活更多,而不用在意调用的是什么类了,这样理解对吗?

一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
13分
如果你的文件是.mm或者说要支持C++混编的话,要加:

#ifdef __cplusplus
extern "C" {
#endif
    
    /**
     * 只取浮点数的前三位
     */
    CGFloat roundedFloat(CGFloat originalFloat);
#ifdef __cplusplus
}
#endif

因为C++编译后的方法名是很乱的,直接编译后按C的方式去找会找不到,因为C++支持函数重载。
你可以把工具方法都放在一起(我也是这样做的)。其他类使用的时候也不用加extern,.h文件里只有方法的申明,没有定义,不会造成重复定义

一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
嗯,谢谢。懂了很多东西。
一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
AFNetworking可以使用block处理网络请求的回调 ,但是使用block又要注意避免循环引用出现内存问题 那么使用AFNetworking的block回调要注意哪些东西呢?
一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
  我只是注意到避免循环引用,没有考虑内存的问题昂~~~好羞涩。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一直研究AFNetWorking 其中用的比较多的是block.基本数据的处理都放在block中,block用多了好不好?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!