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

建设网站号码是多少钱四线城市做网站建设怎么样

建设网站号码是多少钱,四线城市做网站建设怎么样,wordpress迁移打不开,网站后台 网页编辑器一、简介 Block代码块#xff0c;本质上它和其它变量类似#xff0c;不同的是代码块传递的是函数体#xff0c;类似于selector的功能。调用和其它标准函数一样。声明方式有差别。二、代码块定义例#xff1a;int ( ^ MyBlock)( int ) ^ (int m){ return m * 3; };1 …一、简介 Block代码块本质上它和其它变量类似不同的是代码块传递的是函数体类似于selector的功能。调用和其它标准函数一样。声明方式有差别。 二、代码块定义 例int  ( ^    MyBlock)( int ) ^  (int m){ return m * 3; };         1    2         3         4       5        6          7 含义 1:返回类型 2:^是代码块的语法标记 3:代码块的变量名 4:参数类型 5:定义代码块对象 6:参数名是m 7:代码块对象的主体部分 三、代码块调用 拿上面的为例int newValue MyBlock(3); 四、代码块语法的一些规则 (1)当在block中直接使用局部变量时局部变量会被当做是常量编码到block中(两个变量)所以不能在Block中直接修改局部变量 (2)代码块如果想要递归调用代码块变量必须为全局变量或者静态变量。 (3)在代码块中可以使用和改变全局变量和静态变量。 (4)代码块可以使用局部变量但是要改变值的话要在局部变量前面加关键字__block。 五、Block存储域 根据Block中是否引用了外部变量可以将Block存储区域分为三种NSGlobalBlock、NSStackBlock、NSMallocBlock。 1.NSGlobalBlock-存储在全局数据区域: 对于没有引用外部变量的Block无论在ARC还是非ARC下类型都是__NSGlobalBlock__这种类型的block可以理解成一种全局的block和全局变量一样。同时对他进行Copy或者Retain操作也是无效的。 2.NSStackBlock-存储在栈上而对于引用了外部变量的block如果没有对他进行copy他的作用域只会在声明他的函数栈内类型是__NSStackBlock__。对其执行retain操作没有作用。 3.NSMallocBlock-存储在堆上对NSStackBlock类型的block执行copy操作block会被复制到堆上。retain和copy对会使其引用计数加1。 说明一般来说出问题的Block大部分都是NSStackBlock超过了NSStackBlock的作用域NSStackBlock就会销毁。 六、什么时候要对NSConcreteStackBlock执行copy操作? 1.场景配置在栈上的Block如果其所属的变量作用域结束该Block就会废弃。这个时候如果继续使用该Block就应该使用copy方法将NSConcreteStackBlock拷贝为_NSConcreteMallocBlock。当_NSConcreteMallocBlock的引用计数变为0该_NSConcreteMallocBlock就会被释放。 2.如果是非ARC环境需要显式的执行copy或者antorelease方法。 3.而当ARC有效的时候实际上大部分情况下编译器已经为我们做好了自动的将Block从栈上复制到堆上。包括以下几个情况: (1)Block作为返回值时 类似在非ARC的时候对返回值Block执行[[returnedBlock copy] autorelease]; (2)方法的参数中传递Block时 (3)Cocoa框架中方法名中还有useringBlock等时 (4)GCD相关的一系列API传递Block时。 比如:[mutableAarry addObject:stackBlock];这段代码在非ARC环境下肯定有问题而在ARC环境下方法参数中传递NSConcreteStackBlock会自动执行copy。 七、一般的应用场景 假设A要调用B完成一件事但是在B完成事情之后要通知A一下这时候可以使用Block。 1.首先在B中定义一个Block类型比如   typedef void (^DoSomeThingFinished)(id parame); 2.定义Block实例变量DoSomeThingFinished aDoSomeThingFinished; 3.定义B的动作方法-(void)doSomeThing:(DoSomeThingFinished)doSomeThingFinished; 4.动作方法实现规则 1当doSomeThing方法被调用时首先将doSomeThingFinished要copy一下block将从栈赋值到堆上并且赋值给aDoSomeThingFinished以防止调用block时block已经销毁。 2当事情完成时首先检查代码块变量aDoSomeThingFinished是否为nil如果不为nil调用aDoSomeThingFinished代码块变量并传入合适的值。然后release代码块变量aDoSomeThingFinished并赋值nil。 5.在B销毁时检查aDoSomeThingFinished是否为nil如果不为nilrelease并且赋值nil。 6.A调用B的方法如下 [b doSomeThing:^(id parame){ /*动作完成时要做的事情*/ }]; 八、Block循环引用 (1)场景假如A调用BB的API使用了Block。在A中有一个B的实例作为成员变量此时A引用了BA在使用B的API的时候在Block代码中使用了self关键字或者A的成员变量导致block引用了A即B引用了A。从而导致循环引用。 (2)导致的问题如果Block被很好的执行并且B release了BlockA的引用计数自然就降下来了循环引用消失。但是如果B长时间或者根本没有调用Block导致B一直引用Block并且没有释放它从而A的引用计数一直降不下来导致A不能释放。 (3)解决办法 MRC:重新定义一下self如下__block typeof(self) bself self; 将self定义为__block类型在block中使用bself变量此时block就不会retain当前控制器了。当A销毁前首先将B销毁掉B销毁时代码块被release并置nilblock将不会被执行。__block关键字告诉编译器不要retain该变量。 ARC:对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对象。 (4)说明在使用Block时可以大胆的说百分之九十九的情况下是不需要使用weakSelf的。 Block代码块引用self以至retain当前控制器是有道理的这样做是为了让代码块得到很好的执行如果当前控制器已经释放了在回调代码块的时候就不正常了。 我们需要做的是维护好block的调用关系以及生命周期就可以了让block及时释放对当前控制器的引用自然而然也就释放了。 那剩下的那百分之一是什么情况呢即对Block的持有者一直保持Block不释放的情况比如以Block的方式使用加速计除非将加速计停止否则Block一直会被持有如果不希望这样可以在Block中使用weakSelf。 九、Block内存演示代码 // //ARC:正确 //MRC:正确 void exampleA() {     char a A;     ^{         printf(%c\n, a);     }(); } // //ARC:正确。 //MRC:不正确---EXC_BAD_ACCESS //说明:添加的block在栈上ARC下block会被copy。MRC下如果没有执行copy操作此block在函数体结束之后就释放了。 //addObject方法执行的是retain操作不起作用。 void exampleB() {     NSMutableArray *array [NSMutableArray array];     exampleB_addBlockToArray(array);     void (^block)() [array objectAtIndex:0];     block(); } void exampleB_addBlockToArray(NSMutableArray *array) {     char b B;     [array addObject:^{         printf(%c\n, b);     }]; } // //ARC:正确 //MRC:正确 //说明添加的Block为全局Block函数体结束之后它还存在。 void exampleC() {     NSMutableArray *array [NSMutableArray array];     exampleC_addBlockToArray(array);     void (^block)() [array objectAtIndex:0];     block(); } void exampleC_addBlockToArray(NSMutableArray *array) {     [array addObject:^{         printf(C\n);     }]; } // //ARC:正确 //MRC:不正确编译不通过--Returning block that lives on the local stack //说明添加的Block在栈上ARC下block会被copy。MRC下如果没有执行copy操作此block在函数体结束之后就释放了。 typedef void (^dBlock)(); dBlock exampleD_getBlock() {     char d D;     return ^{         printf(%c\n, d);     }; } void exampleD() {     exampleD_getBlock()(); } // //ARC:正确 //MRC:不正确。这个例子和例子4类似除了编译器没有认出有错误所以代码会进行编译然后崩溃。更糟糕的是这个例子比较特别如果你关闭了优化则可以正常运行。所以在测试的时候需要注意。 typedef void (^eBlock)(); eBlock exampleE_getBlock() {     char e E;     void (^block)() ^{         printf(%c\n, e);     };     return block; } void exampleE() {     eBlock block exampleE_getBlock();     block(); }
http://www.pierceye.com/news/879866/

相关文章:

  • 网站建设用源码徐州金网网站建设
  • 老哥们给个关键词威海网站seo
  • 贵州网站备案延庆网站建设师
  • 做网站怎么上词网站建设战略伙伴
  • 绵阳网站推广排名给网站网站做代理
  • 网站轮播代码北京的公司有哪些
  • 网上书城网站开发外文参考文献wordpress禁用谷歌字体插件
  • 团购模板网站全网营销型网站建设模板
  • ac域名网站邯郸中国建设银行网站
  • 广州seo网站开发微信营销的优势
  • 宝塔可以做二级域名网站么有哪些好的做兼职网站
  • 网站建设公司落寞特殊符号网名生成器
  • 设计分享网站在闲鱼可以做网站吗
  • 安全等级保护每个网站必须做吗实惠的网站建设公司
  • vue可以做pc端网站山东专业企业网站建设
  • 推广网站软文高中网站制作
  • 做h的动漫在线观看网站安阳市有几个区几个县
  • 帝国cms地方门户网站模板怀集县住房和城乡规划建设网站
  • 河北住房建设厅网站首页怎么自己建设网站
  • 政务网站建设及安全下载app赚钱的平台
  • 如何制作一个论坛网站都江堰建设局网站
  • 网站建设seo优化浙江广17网站一起做网店
  • WordPress子站站群优化教程网站推广排名
  • 毕设做购物网站容易吗网上商城是什么意思
  • 1688阿里巴巴官方网站杭州网站建设seo
  • 建设网站选什么地方的主机网站上漂亮的甘特图是怎么做的
  • 用什么软件来建网站立创电子元器件商城官网
  • 做视频网站成本如何定制微信小程序
  • 南宁市有哪些做网站的外包企业青州网站建设公司
  • 网站排名点击中国建筑是国企还是央企