gcd使用block需要注意什么
2个回答
展开全部
现代ios应用的开发,不使用GCD和block,效率会降低很多,在今年3月份之前,我在block的学习和使用方面,精力和经验都明显不足,在SF有个牛逼同事,不仅自己积累了一套库,而且对这个库持续进行更新和维护,其架构能力和代码水平都不错,他的代码中使用了大量的GCD,为了适应这些技术,我在coding的过程中,开始有意识的多写GCD的代码,刚开始一切顺利,直到我使用block来作为一个对象的属性,这让我纠结了很久。
我遇到的问题是:1,这种属性block,其他类在使用的时候,应该怎么写? 2,block的类型不为void、int,而是对象时,比如NSString*时,又应该怎么办?
这两个很简单的问题,让我前后一起纠结了2个多小时。下面,我把我的测试代码上上来,希望对遇到同样问题的人,有所帮助。下面直接上代码了。
头文件如下,实现文件中不需要实现任何代码。
#import <Foundation/Foundation.h>
typedef int(^compareBlock)(int a, int b);
@interface HBTestBlock : NSObject
@property(nonatomic, copy) compareBlock compare;
@property(nonatomic, copy) UIView *(^viewGetter)(NSString *imageName); //注意其返回类型为UIView *
@end
下面这两个函数,展示的是如何在其他的类中,使用这两个属性。
#pragma mark 测试对象的属性为block
- (void)testObjPropertyBlock
{
HBTestBlock *objPropertyBlockObj = [[HBTestBlock alloc] init];
objPropertyBlockObj.viewGetter = ^(NSString *imageName){
// return [[UIView alloc] init]; //特别注意此处,若对象不匹配,则会报错,设置为nil也会报错。
return [self currentView];
};
objPropertyBlockObj.viewGetter(@"hello"); //实际执行block
}
- (UIView *)currentView
{
NSLog(@"now I am in currentView");
return nil;
}
- (void)testPropertyBlock
{
HBTestBlock *properBlockObj = [[HBTestBlock alloc] init];
properBlockObj.compare = ^(int a,int b)
{
int result = [self maxer:a another:b];
NSLog(@"the result is %d",result);
return result;
};
NSLog(@"the properBlockObj.compare is %d",properBlockObj.compare(100,200));
}
- (int)maxer:(int)a another:(int)b
{
if (a > b) {
return a;
}
return b;
}
我遇到的问题是:1,这种属性block,其他类在使用的时候,应该怎么写? 2,block的类型不为void、int,而是对象时,比如NSString*时,又应该怎么办?
这两个很简单的问题,让我前后一起纠结了2个多小时。下面,我把我的测试代码上上来,希望对遇到同样问题的人,有所帮助。下面直接上代码了。
头文件如下,实现文件中不需要实现任何代码。
#import <Foundation/Foundation.h>
typedef int(^compareBlock)(int a, int b);
@interface HBTestBlock : NSObject
@property(nonatomic, copy) compareBlock compare;
@property(nonatomic, copy) UIView *(^viewGetter)(NSString *imageName); //注意其返回类型为UIView *
@end
下面这两个函数,展示的是如何在其他的类中,使用这两个属性。
#pragma mark 测试对象的属性为block
- (void)testObjPropertyBlock
{
HBTestBlock *objPropertyBlockObj = [[HBTestBlock alloc] init];
objPropertyBlockObj.viewGetter = ^(NSString *imageName){
// return [[UIView alloc] init]; //特别注意此处,若对象不匹配,则会报错,设置为nil也会报错。
return [self currentView];
};
objPropertyBlockObj.viewGetter(@"hello"); //实际执行block
}
- (UIView *)currentView
{
NSLog(@"now I am in currentView");
return nil;
}
- (void)testPropertyBlock
{
HBTestBlock *properBlockObj = [[HBTestBlock alloc] init];
properBlockObj.compare = ^(int a,int b)
{
int result = [self maxer:a another:b];
NSLog(@"the result is %d",result);
return result;
};
NSLog(@"the properBlockObj.compare is %d",properBlockObj.compare(100,200));
}
- (int)maxer:(int)a another:(int)b
{
if (a > b) {
return a;
}
return b;
}
2015-08-07 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464984
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
gcd使用block注意事项:
1、block 在实现时就会对它引用到的它所在方法中定义的栈变量进行一次只读拷贝,然后在 block 块内使用该只读拷贝;
2、非内联(inline) block 不能直接访问 self,只能通过将 self 当作参数传递到 block 中才能使用,并且此时的 self 只能通过 setter 或 getter 方法访问其属性,不能使用句点式方法。但内联 block 不受此限制;
3、使用 weak–strong dance 技术来避免循环引用;
4、block 内存管理分析:
block 其实也是一个 NSObject 对象,并且在大多数情况下,block 是分配在栈上面的,只有当 block 被定义为全局变量或 block 块中没有引用任何 automatic 变量时,block 才分配在全局数据段上。 __block 变量也是分配在栈上面的。
1、block 在实现时就会对它引用到的它所在方法中定义的栈变量进行一次只读拷贝,然后在 block 块内使用该只读拷贝;
2、非内联(inline) block 不能直接访问 self,只能通过将 self 当作参数传递到 block 中才能使用,并且此时的 self 只能通过 setter 或 getter 方法访问其属性,不能使用句点式方法。但内联 block 不受此限制;
3、使用 weak–strong dance 技术来避免循环引用;
4、block 内存管理分析:
block 其实也是一个 NSObject 对象,并且在大多数情况下,block 是分配在栈上面的,只有当 block 被定义为全局变量或 block 块中没有引用任何 automatic 变量时,block 才分配在全局数据段上。 __block 变量也是分配在栈上面的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询