首页 文章 精选 留言 我的

精选列表

搜索[c/c ],共10000篇文章
优秀的个人博客,低调大师

图像编程魔法门(By C#) 目录

第一部 初阶(图像处理) 第一回 万物资始乃统天——图像处理的基本数据结构 第二回 斗转星移海化田——图像的变换与变形 第三回 要识庐山真面目——图像局部处理与增强 第四回 经络棱角记心间——图像的骨骼、边缘和角点 第五回 北雁南飞西风紧——数学形态学图像处理 第六回 同在方寸不相连——图像分割 第七回 半纸瑟瑟半纸红——彩色图像处理 第八回 逆旅过客弹指还——视频处理 第二部 中阶(图像分析) 第一回 须弥芥子亦大千——图像中的Scale 第二回 碎线入微步履难——图像处理中的线条与形状 第三回 星辰傀儡漫点缀——基于统计的图像处理 第四回 点睛一笔龙跃渊——图像处理中的KeyPoint 第五回 细纹繁叶知何似——纹理分析 第六回 曲直方圆皆落盘——图像识别 第七回 画图省识春风面——图像理解 第八回 众里寻她一指牵——图像检索 外篇(3D计算机图形学) 第三部 高阶(计算机视觉) 本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2010/01/20/1652010.html如需转载请自行联系原作者 xiaotie集异璧实验室(GEBLAB)

优秀的个人博客,低调大师

Objective-C编程 - 关于Block的要点

1. 首先,我们快速过一下,什么是Block? Block是一段代码,它在OC中以^开头,可以有返回值,和参数列表,但就是没有名字。 所以,你可以把它认为是匿名函数。 事实上,它和Swift中的闭包(Closure)是一样的。 或者,学过.NET的童鞋知道委托吧,它和委托也差不多概念。 都是可以在一个方法中传入它,作为参数的方法。 无参无返回值的Block: [MyObject myMethodParam1: xx param2: ^{ ... }]; 有参有返回值的Block: [MyObject myMethodParam1: xx param2: ^BOOL(id param1, id param2) { ... }]; 好了,说了那么多,我们来看个例子: myDict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { NSLog(@"Key - %@: Value - %@", key, value); if ([@"END" isEqualToString:key]) { *stop = YES; } }]; 上面这段代码枚举一个字典的键值对,知道遇到END键值退出循环,否则枚举所有的键值对。 2. 在Block中我们可不可以使用Block范围以外声明的变量呢? 答案是可以的,但是它是只读的,你如果要修改这个变量,会编译错误。 我们还是来看上面那段代码的例子,在循环中,我们增加了一个外部变量,想要让Block提早结束 BOOL stopEarly = NO; double stopValue = 100.2; [myDict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { NSLog(@"Key - %@: Value - %@", key, value); if ([@"END" isEqualToString:key] || [value doubleValue] == stopValue) { *stop = YES; stopEarly = YES; // 这段代码编译会出错!! } }]; 上面的代码stopValue变量的Block内读取没有任何问题,但是当我们企图在Block内修改stopEarly变量的值时,编译出错了! 那么如果,我们执意要修改Block外面的变量,是不是可以呢? 答案是可以的。 我们要使用__block关键字,原理上是通过使用该关键字,我们可以把block外的变量从栈中移到堆中,这样就可以在Block内部使用了。 当Block结束时,变量又回到栈中。 还是上面的代码,我们作下修改,如下: __block BOOL stopEarly = NO; double stopValue = 100.2; [myDict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { NSLog(@"Key - %@: Value - %@", key, value); if ([@"END" isEqualToString:key] || [value doubleValue] == stopValue) { *stop = YES; stopEarly = YES; } }]; if (stopEarly) NSLog(@"Block提前终止了!"); 3. 当我们向Block内的对象发送消息时,系统会创建一个指向该对象的强指针 该强指针会一直保留到Block超出自己的范围,不存在。 4. Block数组 property (nonatomic, strong) NSMutableArray *blockArray; ... - (void) someMethod { [self.blockArray addObject:^{ ... }]; } // 获取数组中的block并调用 void (^doit)(void) = self.blockArray[0]; doit(); 5. 常见的Block中导致循环引用(Memory Cycle)的场景 前面我们曾经提到: 当我们向Block内的对象发送消息时,系统会创建一个指向该对象的强指针 该强指针会一直保留到Block超出自己的范围。 换句话说,Block内的所有对象,都会在堆上保留自己的内存,也就是说,Block会保留 指向这些对象的强指针(strong pointer)。 我们来看下面的代码: @property (nonatomic, strong) NSMutableArray *blockArray; ... // in the blockArray a strong pointer has been kept to the self object // while self holds another strong pointer to blockArray - (void) someMethod { [self.blockArray addObject:^{ [self doSomething]; }]; } 上面的代码的问题是:blockArray保留了一个指向类对象的强引用指针,而类对象,也就是self也保留了 一个指向blockArray的强引用指针。 大家都有强指针指向对方, 它们都无法从栈中释放,这就导致了内存的循环引用。 解决方案:为了打破循环引用,我们要使用一个弱类型的局部变量。什么意思?由于局部变量都是强指针类型,都保留指向堆中的强指针,所以我们要想办法创建一个弱指针类型的局部变量来打破循环引用。可以使用关键字:__weak比如:__weak MyClass *weakSelf = self;这样即使self本身是强指针类型的,而我们创建的weakSelf却变成了弱指针类型。 于是,上面有问题的代码我们可以进行如下的修改: @property (nonatomic, strong) NSMutableArray *blockArray; ... - (void) someMethod { __weak MyClass *weakSelf = self; [self.blockArray addObject:^{ [weakSelf doSomething]; }]; } 这样block这边保留的对于对象的指针就变成了弱类型的指针,循环引用被打破了!这是一个常用的解决方案,必须要记住!!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册