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

怎么清理网站后门文件自适应单页网站模板

怎么清理网站后门文件,自适应单页网站模板,宝塔虚拟主机,搬家公司怎么做网站本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理。 先定义一个block变量,作为后续的例子中使用: typedef void(^BlockCC)(void); BlockCC _block; 1、block中引用外部变量 block中可以直接使用外部的变量,比如 int num…
本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理。
先定义一个block变量,作为后续的例子中使用:
 
  1. typedef void(^BlockCC)(void); 
  2. BlockCC _block; 
1、block中引用外部变量
block中可以直接使用外部的变量,比如
 
  1. int number = 1
  2. _block = ^(){ 
  3.     NSLog(@"number %d", number); 
  4. }; 
那么实际上,在block生成的时候,是会把number当做是常量变量编码到block当中。可以看到,以下的代码,block中的number值是不会发生变化的:
 
  1. int number = 1
  2. _block = ^(){ 
  3.     NSLog(@"number %d", number); 
  4. }; 
  5. number = 2
  6. _block(); 
则输出的值为 1,而不是2。原因就是如上所说。
如果要在block中尝试改变外部变量的值,则会报错的。对于这个问题的解决办法是引入__block标识符。将需要在block内部修改的变量标识为__block scope。更改后的代码如下:
 
  1. __block int number = 1
  2. _block = ^(){ 
  3.     number++; 
  4.     NSLog(@"number %d", number); 
  5. }; 
而这个时候,其实block外部的number和block内部的number指向了同一个值,回到刚才的在外部改变block的例子,它的输出结果将是2,而不是1。有兴趣的可以自己写一个例子试试。
2、block自身的内存管理
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。比如下面的例子。
我在view did load中创建了一个block:
 
  1. - (void)viewDidLoad 
  2.     [superviewDidLoad]; 
  3.   
  4.     int number = 1
  5.     _block = ^(){ 
  6.   
  7.     NSLog(@"number %d", number); 
  8. }; 
并且在一个按钮的事件中调用了这个block:
 
  1. - (IBAction)testDidClick:(id)sender { 
  2.     _block(); 
此时我按了按钮之后就会导致程序崩溃,解决这个问题的方法就是在创建完block的时候需要调用copy的方法。copy会把block从栈上移动到堆上,那么就可以在其他地方使用这个block了~
修改代码如下:
 
  1. _block = ^(){ 
  2.     NSLog(@"number %d", number); 
  3. }; 
  4.   
  5. _block = [_blockcopy]; 
同理,特别需要注意的地方就是在把block放到集合类当中去的时候,如果直接把生成的block放入到集合类中,是无法在其他地方使用block,必须要对block进行copy。不过代码看上去相对奇怪一些:
 
  1. [array addObject:[[^{ 
  2.     NSLog(@"hello!"); 
  3. } copy] autorelease]]; 

3、循环引用
这一点其实是在第一点的一个小的衍生。当在block内部使用成员变量的时候,比如
 
  1. @interface ViewController : UIViewController 
  2.     NSString *_string; 
  3. @end 
在block创建中:
 
  1. _block = ^(){ 
  2.     NSLog(@"string %@", _string); 
  3. }; 
这里的_string相当于是self->_string;那么block是会对内部的对象进行一次retain。也就是说,self会被retain一次。当self释放的时候,需要block释放后才会对self进行释放,但是block的释放又需要等self的dealloc中才会释放。如此一来变形成了循环引用,导致内存泄露。
 
修改方案是新建一个__block scope的局部变量,并把self赋值给它,而在block内部则使用这个局部变量来进行取值。因为__block标记的变量是不会被自动retain的。
 
  1. __block ViewController *controller = self
  2. _block = ^(){ 
  3.     NSLog(@"string %@", controller->_string); 
  4. }; 
先写到这里,基本是我在用block时候碰

到的一些问题。需要更详细的解释,可以看看《Adanced Mac OS X Programming》这本书,推荐给大家。
http://www.yayakq.cn/news/465594/

相关文章:

  • wordpress如何设置中文百度seo优化技术
  • 如何设计大型电商网站建设asp汽车租凭网站源码
  • wordpress自动创建子站建设家具网站
  • 创建网站需要什么平台个人域名 企业网站备案
  • 深圳企业网站制作哪个wordpress 本地
  • 用dedecms做的网站 脚本是什么郑州模板网站建设
  • 网站建设公司账户搭建创建一个公司需要什么
  • 找it工作有什么好的招聘网站免费logo设计制作
  • 斗门区住房和城乡建设网站聂教练做0网站
  • 杭州燎远精品课程网站建设网站空间优惠
  • 相册网站模板百度一下百度主页
  • 推荐做ppt照片的网站wordpress 相关插件
  • 清苑建设局网站全球网站域名
  • 沧州大型网站建设在国外建网站方便吗
  • 食品网站建设的照片西安做公司网站公司
  • 浙江省建设厅举报网站网站建设期末作业要求
  • wordpress 经典网站网店运营管理与营销推广
  • 京东网站建设过程推荐盐城网站开发
  • 东莞微网站建设费用友情链接代码
  • 免费网站如何做宣传文案代写收费标准
  • 做网站要多少钱联系方式怎样知道网站有没有做推广
  • asp网站后台管理系统源码自贡企业网站建设公司
  • 在vs上用c 做登录网站简述建设一个网站的基本步骤
  • 百度快速收录网站如何做房产网站
  • 做网站为什么能赚钱网站产品优化描述
  • 农业综合管理网站建设怎么做网站文章伪原创
  • 网站seo百度百科网站排名突然掉了怎么回事
  • 做网站好公司wordpress 注册登陆插件
  • 建设六马路小学 网站哪个网站的图片可以做素材
  • 网站备案多少天江苏省句容建设局网站