ios10.3如何使用迅雷在 iOS 5 中使用 Block

苹果5,系统6.1.4,打开第三方应用视频_ios9吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:310,398贴子:
苹果5,系统6.1.4,打开第三方应用视频收藏
视频来自:
点击赢取你的第二台手机—魅蓝 E2
打开QQ的速度跟9.3.1和9.3.2都差不多。
喜欢这种视觉效果,打开软件快慢无所谓
不错不错,我iOS5的4s开酷狗和6s持平
这个动画效果还是赞呢
卡这样...还不错呢?
中国玩具展-品牌企业成功之选
cpu比之后的手机差那么多,慢了也是理所当然,为什么这个吧那么多小白把开第三方软件慢的锅甩给系统
速度比9.32明显慢多了 只是动画不错
老设备打开软件有点慢
反正到时候QQ微信这些都要iOS7以上才行
想买个苹果5ios6系统的
反应是快,你现在的版本应该是最新的版本,如果用之前的版本不知道怎么样
不知道有什么意义,大部分软件都用不了
吹吧 614状态栏是这样的?
动画效果真好
没6s快哦 毕竟老了
又没有6s快……
楼主这QQ是哪个版本的啊?现在的软件都越做越大而且那些功能都没什么用,想去抓个这个老版本的包
动画很不错
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或iOS如何使用Block - 简书
iOS如何使用Block
本文转载于 , 如有侵权,请原著与我沟通,可以立即取消发布。
什么是Block
Blocks 是 iOS 4.0 之后有的新功能。Block 能够让我们的代码变得更简单,能够减少代码量,降低对于 delegate 的依赖,还能够提高代码的可读性。
本质上来说,一个 Block 就是一段能够在将来被执行的代码。本身 Block 就是一个普通的 Objective-C 对象。正因为它是对象,Block 可以被作为参数传递,可以作为返回值从一个方法返回,可以用来给变量赋值。
在其他语言(Python, Ruby, Lisp etc.)中,Block 被叫做闭包——因为他们在被声明的时候的封装状态。Block 为指向它内部的局部变量创造了一个常量 copy。
在 Block 之前,如果我们想要调用一段代码,然后之后一段时间,让它给我们返回,我们一般会使用 delegate 或者 NSNotification。这样的写法没什么问题,但是使用过 delegate 和 NSNotification 大家就应该会感觉到——我们会不可避免的将代码写的到处都是,我们需要在某处开始一个任务,在另外一个地方来处理这个返回结果。使用 Block 就可以在一定程度上避免这个问题。
如何使用 Block
下面这张图片来自苹果官方文档:
Block 的声明格式如下:
return_type (^block_name)(param_type, param_type, ...
^ 符号其实就是专门用来表示:我们在声明一个 Block。
声明举例:
int (^add)(int,int)
block 的定义格式如下:
^return_type(param_type param_name, param_type param_name, ...)
{ ... return return_ }
要注意,定义和声明的格式有一些不同。定义以 ^ 开始,后面跟着参数(参数在这里一定要命名),顺序和类型一定要和声明中的顺序一样。定义时,返回值类型是 optional 的,我们可以在后面的代码中确定返回值类型。如果有多个返回 statement,他们也只能有一个返回值类型,或者把他们转成同一个类型。block 的定义举例:
^(int number1, int number2){ return number1+number2 }
我们把声明和定义放在一起:
int (^add)(int,int) = ^(int number1, int number2){ return number1+number2;}
调用的时候:
int resultFromBlock = add(2,2);
我们将使用 block 与不使用 block 做一些对比
举例 :NSArray普通 for 循环:
for (int i = 0 ; i & [theArray count] ; i++) {
NSLog(@"The object at index %d is %@",i,[theArray objectAtIndex:i]);
这个 BOOL stop 现在看上去有点奇怪,但看到后面 block 实现就能理解了
快速迭代:
int idx = 0;
for (id obj in theArray) {
NSLog(@"The object at index %d is %@",idx,obj);
使用 block :
[theArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
NSLog(@"The object at index %d is %@",idx,obj);
在上面的代码中, BOOL stop 设置为 YES 的时候,可以从block 内部停止下一步运行。从上面三段代码的对比中,我们可以至少可以看出 block 两方面的优势:
简化了代码
提高了速度
举例:UIView Animation
非 Block 实现
-(void)removeAnimationView:(id)sender {
[animatingView removeFromSuperview];
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[UIView beginAnimations:@"Example" context:nil];
[UIView setAnimationDuration:5.0];
setAnimationDidStopSelector:@selector(removeAnimationView)];
[animatingView setAlpha:0];
[animatingView setCenter:CGPointMake(animatingView.center.x+50.0,
animatingView.center.y+50.0)];
[UIView commitAnimations];
block 实现
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[UIView animateWithDuration:5.0 animations:^{
[animatingView setAlpha:0];
[animatingView
setCenter:CGPointMake(animatingView.center.x+50.0, animatingView.center.y+50.0)];
completion:^(BOOL finished) {
[animatingView removeFromSuperview];
同样我们可以看出 block 的优势:简化了代码
让代码保持在一起,不需要在一个地方开始动画,在另一个地方回调。读写起来都比较方便。苹果也建议这么做,不然苹果用 block 重写以前的代码干嘛呢~
block 的应用
1. enumerateObjectsUsingBlock
之前的代码实例中已经提到过,用来迭代数组十分方便,具体看下面的代码实例:
-(NSArray*)retrieveInventoryItems {
// 1 - 声明
NSMutableArray* inventory = [NSMutableArray new];
NSError* err =
// 2 - 得到 inventory 数据
NSArray* jsonInventory = [NSJSONSerialization JSONObjectWithData:
[NSData dataWithContentsOfURL:[NSURL URLWithString:kInventoryAddress]]
options:kNilOptions
error:&err];
// 3 - 使用 block 遍历
[jsonInventory enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSDictionary* item =
[inventory addObject:[[IODItem alloc]
initWithName:[item objectForKey:@"Name"]
andPrice:[[item objectForKey:@"Price"] floatValue]
andPictureFile:[item objectForKey:@"Image"]]];
// 4 - 返回一个 inventory 的 copy
return [inventory copy];
我们在上面的代码中 3 处使用了 block:
使用了 enumerateObjectsUsingBlock 方法,把一个普通的 NSDictionary 转化成一个 IODItem 类的对象。我们对一个JSON Array 对象发送 enumerateObjectsUsingBlock 消息,迭代这个 array,得到 item 字典,然后用这个字典得到 IODItem,最后把这些对象添加到 inventory 数组然后返回。
2.sortedArrayUsingComparator
enumerateObjectsUsingBlock我们上面已经用过,主要来看 sortedArrayUsingComparator ,这个 block 以一个升序返回一个 array,这个升序由一个 NSComparator block 决定
注意:compare 方法的使用有点没太明白,但是根据 sortedArrayUsingComparator 是返回一个升序数组,所以compare 方法应该是返回两者之间更大的??
-(NSString*)orderDescription {
// 1 - 声明
NSMutableString* orderDescription = [NSMutableString new];
// 2 - 使用 block 进行排序
NSArray* keys = [[self.orderItems allKeys] sortedArrayUsingComparator:
^NSComparisonResult(id obj1, id obj2) {
IODItem* item1 = (IODItem*)obj1;
IODItem* item2 = (IODItem*)obj2;
return [item1.name compare:item2.name];
// 3 - 使用 block 遍历
[keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
IODItem* item = (IODItem*)
NSNumber* quantity = (NSNumber*)[self.orderItems objectForKey:item];
[orderDescription appendFormat:@"%@ x%@\n", item.name, quantity];
// 4 - 返回
return [orderDescription copy];
注释2:得到一个包含 dictionary 中所有 key 的数组,然后使用 sortedArrayUsingComparator 这个 block 方法,把这些所有的 key 按升序进行排序。
总结一些比较常用的 block
enumerateObjectsUsingBlock 这个是我最常使用的 block ,上面已经介绍过了,用来迭代数组非常方便,个人认为这应该是最好用的 block 了。
enumerateObjectsAtIndexes:usingBlock: 和 enumerateObjectsUsingBlock 差不多,但是我们可以选择只迭代数组的一部分,而不是迭代整个数组。这个需要迭代的范围由 indexSet 参数传入。
indexesOfObjectsPassingTest 返回一个数组中,通过了特定的 test 的对象的 indexSet。用这个 block 来查找特定的数据很方便。
NSDictionary
enumerateKeysAndObjectsUsingBlock 迭代整个字典,返回字典中所有的 key 和对应的值(如果是想用这个 block 来代替 objectForKey 方法,确实有些多此一举,但是如果你需要返回字典中全部的 key, value,这个 block 是一个很好的选择)。
keysOfEntriesPassingTest 和数组里的 indexesOfObjectsPassingTest block 类似,返回通过特定的 test 的一组对象的 key。
UIView Animation
animateWithDuration: animation: completion: 写过动画大家应该还是比较了解的,动画的 block 实现确实比非 block 实现简单、方便了很多。
dispatch async:这时异步 GCD 的主要功能,在这里其实最重要的是要理解 block 是一个普通的对象,是可以作为参数传递给 dispatch queue 的。
使用我们自己的 block
除了使用这些系统提供给我们的 block,我们有时候自己写的方法里也许也想要用到 block。我们来看一些简单的示例代码,这段代码声明了一个接收 block 作为参数的方法:
-(void)doMathWithBlock:(int (^)(int, int))mathBlock {
self.label.text = [NSString stringWithFormat:@"%d", mathBlock(3, 5)];
// 如何调用
-(IBAction)buttonTapped:(id)sender {
[self doMathWithBlock:^(int a, int b) {
return a +
因为 block 就是一个 Objective-C 对象,所以我们可以把 block 存储在一个 property 中以便之后调用。这种方式在处理异步任务的时候特别有用,我们可以在一个异步任务完成之后存储一个 block,之后可以调用。下面是一段示例代码:
@property (strong) int (^mathBlock)(int, int);
// 存储 block 以便之后调用
-(void)doMathWithBlock:(int (^)(int, int))mathBlock {
self.mathBlock = mathB
// 调用上面的方法,并传入一个 block
-(IBAction)buttonTapped:(id)sender {
[self doMathWithBlock:^(int a, int b) {
return a +
-(IBAction)button2Tapped:(id)sender {
self.label.text = [NSString stringWithFormat:@"%d", self.mathBlock(3, 5)];
还有,我们可以使用 typedef 来简化block 语法,当然效果和上面的是差不多的,我们来看下面的例子:
typedef int (^MathBlock)(int, int);
// 使用 tpyedef 声明一个property
@property (strong) MathBlock mathB
-(void)doMathWithBlock:(MathBlock) mathBlock {
self.mathBlock = mathB
-(IBAction)buttonTapped:(id)sender {
[self doMathWithBlock:^(int a, int b) {
return a +
-(IBAction)button2Tapped:(id)sender {
self.label.text = [NSString stringWithFormat:@"%d", self.mathBlock(3, 5)];
学通信的iOS程序狗?Xcode5.0正式版7和Xcode5正式版在昨天正式可以下载。7不多说了,交互设计,界面风格,操作的简化程度都属于比较领先的水平。这里来说说Xcode5正式版,和以前的Xcode5测试版来比,正式版改动不大,不过也有稍许变化。整体来讲,跟Xcode4.6比,属于换了一个时代- -(因为以前的工程换到这里需要改很多地方)Xcode5给我的感觉就是:界面简洁扁平化,工程图形化,还有就是。。白。为什么说白,看看IB和配置工程就知道了。。。相比4.6来讲,5在操作上还是有很多大的改进。也可以用于旧版本的,需要把arm64去掉,把XIB文件设置成之前的版本就好。不过也有一些细节需要注意。所以嫌麻烦的话可以用之前版本的- -。言归正传,这里来认识下三种IOS常见的回调模式。代理模式作为IOS中最常见的通讯模式,代理几乎无处不在。看实例这里有一个数组,我们首先通过代理的方式将数组传递到其他方法中去。设置协议及方法@protocol CallBackD
@ ViewController : UIViewController
@property (weak, nonatomic) id&CallBackDelegate&
@protocol CallBackDelegate &NSObject&
- (void)showArrayWithDelegate:(NSArray *)
@end@interface ViewController () &CallBackDelegate&点击按钮传递数组让其显示- (IBAction)delegateCallBack
NSDictionary *dict = @{@&array&: @[@&Chelsea&, @&MUFC&, @&Real Madrid&]};
NSArray *array = dict[@&array&];
[self.delegate showArrayWithDelegate:array];
}调用,显示- (void)showArrayWithDelegate:(NSArray *)array
_outputLabel.text = array[2];
}最重要也是最容易忽略的,就是一定要设置delegate的指向。完成后屏幕显示使用通知中心通知中心的方式可以不用设置代理,但是需要设置观察者和移除观察者。- (IBAction)callBack
NSDictionary *dict = @{@&array&: @[@&Chelsea&, @&MUFC&, @&Real Madrid&]};
NSArray *array = dict[@&array&];
[[NSNotificationCenter defaultCenter] postNotificationName:@&OutputArrayNotification& object:array];
}注册和移出观察者- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(outputWithNote:) name:@&OutputArrayNotification& object:nil];
- (void)viewDidDisappear:(BOOL)animated
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@&OutputArrayNotification& object:nil];
}显示- (void)outputWithNote:(NSNotification *)aNotification
NSArray *receiveArray = [aNotification object];
_outputLabel.text = receiveArray[0];
}Block什么是Block:从C的声明符到Objective-C的Blocks语法块代码以闭包得形式将各种内容进行传递,可以是代码,可以是数组无所不能。块代码十分方便将不同地方的代码集中统一,使其易读性增强。来看这里怎么进行数组传递。typedef void (^Arr_Block)(NSArray *array);- (void)showArrayUsingBlock:(Arr_Block)block
NSDictionary *dict = @{@&array&: @[@&Chelsea&, @&MUFC&, @&Real Madrid&]};
NSArray *array = dict[@&array&];
block(array);
}调用方法,显示- (IBAction)blockCallBack
[self showArrayUsingBlock:^(NSArray *array) {
_outputLabel.text = array[1];
}三种模式都很轻松~以上就是本篇全部内容,欢迎指正和交流。转载注明出处~Block使用中的一些疑问解答
招聘信息:
本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理。
先定义一个block变量,作为后续的例子中使用:
typedef&void(^BlockCC)(void);&BlockCC&_&
1、block中引用外部变量
block中可以直接使用外部的变量,比如
int&number&=&1;&_block&=&^(){&&&&&NSLog(@"number&%d",&number);&};&
那么实际上,在block生成的时候,是会把number当做是常量变量编码到block当中。可以看到,以下的代码,block中的number值是不会发生变化的:
int&number&=&1;&_block&=&^(){&&&&&NSLog(@"number&%d",&number);&};&number&=&2;&_block();&
则输出的值为 1,而不是2。原因就是如上所说。
如果要在block中尝试改变外部变量的值,则会报错的。对于这个问题的解决办法是引入__block标识符。将需要在block内部修改的变量标识为__block scope。更改后的代码如下:
__block&int&number&=&1;&_block&=&^(){&&&&&number++;&&&&&NSLog(@"number&%d",&number);&};&
而这个时候,其实block外部的number和block内部的number指向了同一个值,回到刚才的在外部改变block的例子,它的输出结果将是2,而不是1。有兴趣的可以自己写一个例子试试。
2、block自身的内存管理
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。比如下面的例子。
我在view did load中创建了一个block:
-&(void)viewDidLoad&{&&&&&[superviewDidLoad];&&&&&&&int&number&=&1;&&&&&_block&=&^(){&&&&&&&NSLog(@"number&%d",&number);&};&}&
并且在一个按钮的事件中调用了这个block:
-&(IBAction)testDidClick:(id)sender&{&&&&&_block();&}&
此时我按了按钮之后就会导致程序崩溃,解决这个问题的方法就是在创建完block的时候需要调用copy的方法。copy会把block从栈上移动到堆上,那么就可以在其他地方使用这个block了~
修改代码如下:
_block&=&^(){&&&&&NSLog(@"number&%d",&number);&};&&&_block&=&[_blockcopy];&
同理,特别需要注意的地方就是在把block放到集合类当中去的时候,如果直接把生成的block放入到集合类中,是无法在其他地方使用block,必须要对block进行copy。不过代码看上去相对奇怪一些:
[array&addObject:[[^{&&&&&NSLog(@"hello!");&}&copy]&autorelease]];&
3、循环引用
这一点其实是在第一点的一个小的衍生。当在block内部使用成员变量的时候,比如
@interface&ViewController&:&UIViewController&{&&&&&NSString&*_&}&@end&
在block创建中:
_block&=&^(){&&&&&NSLog(@"string&%@",&_string);&};&
这里的_string相当于是self->_string;那么block是会对内部的对象进行一次retain。也就是说,self会被retain一次。当self释放的时候,需要block释放后才会对self进行释放,但是block的释放又需要等self的dealloc中才会释放。如此一来变形成了循环引用,导致内存泄露。
修改方案是新建一个__block scope的局部变量,并把self赋值给它,而在block内部则使用这个局部变量来进行取值。因为__block标记的变量是不会被自动retain的。
__block&ViewController&*controller&=&self;&_block&=&^(){&&&&&NSLog(@"string&%@",&controller-_string);&};&
先写到这里,基本是我在用block时候碰
到的一些问题。需要更详细的解释,可以看看《Adanced Mac OS X Programming》这本书,推荐给大家。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量5533点击量5274点击量3361点击量3007点击量2954点击量2909点击量2826点击量2716点击量2687
&2016 Chukong Technologies,Inc.
京公网安备89}

我要回帖

更多关于 iphone5ios10使用电信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信