当前位置: 首页 > news >正文

公司做网站的流程免费网站建设资讯

公司做网站的流程,免费网站建设资讯,wordpress收录插件,开网站建设公司心得本文不讲block如何声明及使用#xff0c;只讲block在使用过程中暂时遇到及带来的隐性危险。 主要基于两点进行演示#xff1a; 1.block 的循环引用(retain cycle) 2.去除block产生的告警时#xff0c;需注意问题。 有一次#xff0c;朋友问我当一个对象中的block块中的访问… 本文不讲block如何声明及使用只讲block在使用过程中暂时遇到及带来的隐性危险。 主要基于两点进行演示 1.block 的循环引用(retain cycle) 2.去除block产生的告警时需注意问题。 有一次朋友问我当一个对象中的block块中的访问自己的属性会不会造成循环引用我哈绰绰的就回了一句不会。兄弟看完这个希望你能理解我为什么会说不会循环引用。别废话演示开始。 下面是我专们写了一个类来演示 头文件.h [objc] view plaincopy //   //  BlockDemo.h   //  blockDemo   /*   -fno-objc-arc      由于Block是默认建立在栈上, 所以如果离开方法作用域, Block就会被丢弃,   在非ARC情况下, 我们要返回一个Block ,需要 [Block copy];      在ARC下, 以下几种情况, Block会自动被从栈复制到堆:      1.被执行copy方法   2.作为方法返回值   3.将Block赋值给附有__strong修饰符的id类型的类或者Blcok类型成员变量时   4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中传递的时候.   */      #import Foundation/Foundation.h      class BlockDemo;      typedef void(^executeFinishedBlock)(void);   typedef void(^executeFinishedBlockParam)(BlockDemo *);      interface BlockDemo : NSObject   {       executeFinishedBlock finishblock;       executeFinishedBlockParam finishblockparam;   }      /**   *  执行结果   */   property (nonatomic,assign) NSInteger resultCode;      /**   *  每次调用都产生一个新对象   *   *  return   */    (BlockDemo *)blockdemo;      /**   *  不带参数的block   *   *  param block   */   - (void)setExecuteFinished:(executeFinishedBlock)block;      /**   *  带参数的block   *   *  param block   */   - (void)setExecuteFinishedParam:(executeFinishedBlockParam)block;      - (void)executeTest;         end   实现文件 [objc] view plaincopy //   //  BlockDemo.m   //  blockDemo   //   //  Created by apple on 14-7-24.   //  Copyright (c) 2014年 fengsh. All rights reserved.   //      #if __has_feature(objc_arc)  __clang_major__  3       #define OBJC_ARC_ENABLED 1   #endif // __has_feature(objc_arc)      #if OBJC_ARC_ENABLED       #define OBJC_RETAIN(object)         (object)       #define OBJC_COPY(object)           (object)       #define OBJC_RELEASE(object)        object  nil       #define OBJC_AUTORELEASE(object)    (object)   #else       #define OBJC_RETAIN(object)           [object retain]       #define OBJC_COPY(object)             [object copy]       #define OBJC_RELEASE(object)          [object release], object  nil       #define OBJC_AUTORELEASE(object)      [object autorelease]   #endif      #import BlockDemo.h      implementation BlockDemo          (BlockDemo *)blockdemo   {       return OBJC_AUTORELEASE([[BlockDemo alloc]init]);   }      - (id)init   {       self  [super init];       if (self) {           NSLog(Object Constructor!);       }       return self;   }      - (void)dealloc   {       NSLog(Object Destoryed!);   #if !__has_feature(objc_arc)       [super dealloc];   #endif   }      - (void)setExecuteFinished:(executeFinishedBlock)block   {       OBJC_RELEASE(finishblock);       finishblock  OBJC_COPY(block); //在非ARC下这里不能使用retain   }      - (void)setExecuteFinishedParam:(executeFinishedBlockParam)block   {       OBJC_RELEASE(finishblockparam);       finishblockparam  OBJC_COPY(block); //在非ARC下这里不能使用retain   }      - (void)executeTest   {       [self performSelector:selector(executeCallBack) withObject:nil afterDelay:5];   }      - (void)executeCallBack   {       _resultCode  200;              if (finishblock)       {           finishblock();       }              if (finishblockparam)       {           finishblockparam(self);       }   }      end   上面是因为考虑到在ARC 和非ARC中进行编译演示所以我特意加了预编译判断。主要是方便不要改动太多的代码来给大家演示。 在非环境下 执行下在语句的测试 [objc] view plaincopy - (IBAction)onTest:(id)sender   {       BlockDemo *demo  [[[BlockDemo alloc]init]autorelease];              [demo setExecuteFinished:^{           if (demo.resultCode  200) {               NSLog(call back ok.);           }       }];              [demo executeTest];           }   输出结果: [cpp] view plaincopy 2014-07-24 19:08:04.852 blockDemo[25104:60b] Object Constructor!   2014-07-24 19:08:09.854 blockDemo[25104:60b] call back ok.   很显然。尽管demo 是局部变量并autorelease但可以看出自然至终并没有得到释放这是因为block中使用了 block内进行访问了自身的resultCode属性。相信很多朋友也都会解决这种循环引用问题。就是在变量前面加个__block就像这样。 [objc] view plaincopy __block BlockDemo *demo  [[[BlockDemo alloc]init]autorelease];   在非下只虽一个__block关键词就可以。相对还是简单的。 好下面再来看一下在模式下的block循环引用又是怎么样的。 在ARC模式下 执行下面语句 [cpp] view plaincopy - (IBAction)onTest:(id)sender   {       BlockDemo *demo  [[BlockDemo alloc]init];       [demo setExecuteFinished:^{           if (demo.resultCode  200) {               NSLog(call back ok.);           }       }];              [demo executeTest];           }   执行输出结果 [objc] view plaincopy 2014-07-24 19:20:33.997 blockDemo[25215:60b] Object Constructor!   2014-07-24 19:20:39.000 blockDemo[25215:60b] call back ok.   同样会被引入循环。 相信看到这里的人大多都要喷了这哪个不知道呀还知道怎么解决呢非ARC中加了个__block当然的在ARC中加一个__weak就搞定了。嗯确实是这样但别急接着往下看绝对有收获。在这里先自己默认想一下你是如何加这个__weak的。 对于第一个问是点block 的循环引用(retain cycle)到这里暂告结束。下面讲第二点。因为block告警在非ARC 中暂未发现因写法引入如果你知道麻烦告诉我怎么弄产生告警我好研究一下。 下面讲在模式下去除因写法产生的告警时需要注意的问题。 像上面的写法其实在ARC中会产生Capturing demo strongly in this block is likely to lead to a retain cycle告警。如下图 在ARC中编译器智能化了直接提示这样写会产生循环引用。因此很多爱去除告警的朋友就会想法去掉好咱再来看去掉时需注意的问题。 情况一 [objc] view plaincopy - (IBAction)onTest:(id)sender   {       __weak BlockDemo *demo  [[BlockDemo alloc]init];       [demo setExecuteFinished:^{           if (demo.resultCode  200) {               NSLog(call back ok.);           }       }];       [demo executeTest];   }   直接在前面加一个__weak但这样真的没有告警了吗如果有哪么恭喜欢你说明编译器还帮你大忙。见下图 这时还会告警说这是一个WEAK变量就马上会被release。因此就不会执行block中的内容。大家可以运行一下看 输出结果为 [cpp] view plaincopy 2014-07-24 19:38:02.453 blockDemo[25305:60b] Object Constructor!   2014-07-24 19:38:02.454 blockDemo[25305:60b] Object Destoryed!   很显然马上被release了所以block 中的代码根本就不执行。 谢天谢地幸好编译器提前告诉了我们有这个隐性危险。相信大家为解决告警又会得到一个比较圆满的解决方案见下 [objc] view plaincopy - (IBAction)onTest:(id)sender   {       BlockDemo *demo  [[BlockDemo alloc]init];              __weak typeof(BlockDemo) *weakDemo  demo;              [demo setExecuteFinished:^{           if (weakDemo.resultCode  200) {               NSLog(call back ok.);           }       }];       [demo executeTest];   }   这样写即去除了告警又保证了block的运行。这才是我们最终想要的结果。输出为 [cpp] view plaincopy 2014-07-24 19:40:33.204 blockDemo[25328:60b] Object Constructor!   2014-07-24 19:40:38.206 blockDemo[25328:60b] call back ok.   2014-07-24 19:40:38.207 blockDemo[25328:60b] Object Destoryed!   但大家别得意。有提示相信大家都能处理并得到个好的解决方法。哪么下面大来再来看一下这个写法让你真心甘拜下风。。。。。 [objc] view plaincopy - (IBAction)onTest:(id)sender   {       __weak BlockDemo *demo  [BlockDemo blockdemo]; //这里才是重点前面是[[BlockDemo alloc]init];会有告警。              [demo setExecuteFinished:^{           if (demo.resultCode  200) {               NSLog(call back ok.);           }       }];       [demo executeTest];   }   其实只是把init放到了类方法中进行书写而已但会有什么不同。[objc] view plaincopy  (BlockDemo *)blockdemo   {       return OBJC_AUTORELEASE([[BlockDemo alloc]init]);   }   不同点见下图真心看不到作何告警是不是。但这存在什么风险风险就是运行的时候block根本就没有run。因为对象早就释放了。 直接输出 [cpp] view plaincopy 2014-07-24 19:47:53.033 blockDemo[25395:60b] Object Constructor!   2014-07-24 19:47:53.035 blockDemo[25395:60b] Object Destoryed!   因此写这个主要用来告戒一些喜欢用BLOCK但又想当然的朋友有一些朋友喜欢去除告警但只是盲目的加上__weak 或__block关键语往往可能存在一些重大的安全隐患。就像演示中block根本不走。如果到了发布时为了去告警而这样简单的处理了并没有进行测试就打包。哪么将死得很惨。。。。。 好到了尾声来说说为什么朋友问我block会不会引行死循环我说不会的理由。 见码 [objc] view plaincopy - (IBAction)onTest:(id)sender   {       BlockDemo *demo  [BlockDemo blockdemo];//[[BlockDemo alloc]init];              [demo setExecuteFinishedParam:^(BlockDemo * ademo) {           if (ademo.resultCode  200) {               NSLog(call back ok.);           }       }];              [demo executeTest];   }   不管是在外面init,还是在里面且没有加__block 及__weak。为什么因为我个人常常在使用自己写的block时如果是回调比较喜欢把自身当作参数传到block中。这样期实是编译器给我们做了弱引用。因此不会产生循环引用。 由于我一直都这样写block所以朋友一问起我就说不会循环引用了因为压根他碰到的就是前面讲述的哪种访问方式而我回答的是我的这种使用方式。正因为口头描述与实际回复真是差之千里。。。哈哈。为了验证我朋友的这个我特意写了个这篇文章希望对大家有所帮助。最后谢谢大家花时间阅读。
http://www.zqtcl.cn/news/905151/

相关文章:

  • 站长工具seo综合查询5g网站建设整改落实情况
  • 网站建设方案 流程wordpress客户案例
  • 网站被收录的过程如何创造属于自己的软件
  • 做神马网站优化快速排国外乡村建设网站
  • 东莞网站优化服务公司天河做网站开发
  • ui在线设计网站滁州 来安县建设局网站
  • 做印尼购物网站如何发货wordpress怎么换中文
  • 深圳方维网站建设公司企业网站推广方式和策略
  • 沙洋县住房和城乡建设局网站单页网站下载
  • 江宁区住房建设局网站建设工程扣分查询网站
  • wordpress火车采集优化算法分类
  • 厦门做网站公司有哪些有什么好的加盟店项目
  • wap网站开发技术怎么做消费信贷网站
  • 公司网站开发外包公司深圳网站建设sz886
  • 中英文网站建设需要懂英语吗电气网站设计
  • 双语网站用什么程序做新网站如何被网站收录
  • 怎么做视频平台网站想开个小说网站怎么做
  • 网站安全监测预警平台建设成效阐述网络营销策略的内容
  • 网站上的qq如何做悬浮沧州做网站的公司
  • 电子商务网站系统规划报告移动商城 网站建设方法方式
  • 网站建设架构选型引擎seo优
  • 什么电脑做网站前段用网站建设工作人员有哪些职责
  • 网站建设技巧网站建设 总结
  • 有站点网络营销平台搜一下百度
  • 沈阳网站建设找德泰诺wordpress 访客计数器
  • 专业网站建设价格分析企业展示型网站建设方案
  • 东丽做网站公司帮做网站的公司
  • 网站的icon图标做多大验证wordpress
  • html制作音乐网站代码已经买了域名怎么做网站
  • 网站做收付款接口山东专业的制作网站