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

金坛建设银行总行网站电商推广技巧

金坛建设银行总行网站,电商推广技巧,漂亮的flash网站,智鼎互联网站建设来源http://www.wtoutiao.com/p/11dgbk4.html 先来简单介绍一下Block Block是什么#xff1f; 苹果推荐的类型#xff0c;效率高#xff0c;在运行中保存代码。用来封装和保存代码#xff0c;有点像函数#xff0c;Block可以在任何时候执行。 Block和函数的相似性#xf… 来源http://www.wtoutiao.com/p/11dgbk4.html 先来简单介绍一下Block Block是什么 苹果推荐的类型效率高在运行中保存代码。用来封装和保存代码有点像函数Block可以在任何时候执行。 Block和函数的相似性1可以保存代码2有返回值3有形参4调用方式一样。 Block 底层实现 定义一个简单的block 我们再给a赋值为20此时打印出来a 的值还是10 但当我们在第一次给a 赋值时前面加上__block 的时候则打印出来20。 那么为什么加上__block 后 就打印出20了呢这个原理是什么呢 其实可以用两个词来概括传值 和传址。 可能这样说大家觉得有点扯接下来 用C 代码进行编译。 打开终端做如下操作 在当前文件夹下会得到一个.cpp 文件。 此时打开当前的.cpp 文件(会有差不多10万行代码)前面我们都忽略只需要滚动到最后此时你会发现block跟OC中的变化。 接下来我们一个个来看这个block先来看等号左边的。 void(*block)() 这是一个没有参数没有返回值的函数指针既然是一个函数指针那它就是一个变量变量里面只能保存函数地址然后它又在等号的左边是不是意味着右边返回的是一个函数地址(自己推断)。 再看等号右边 ((void (*)())__main_block_impl_0((void *)__main_block_func_0, __main_block_desc_0_DATA, a)); 参数(自我推断) ((void (*)()) 强转(自己理解其实没有实际含义不影响自己本身的类型) 取址 后面都是函数的调用如果不是也不会得到一个函数指针的。 __main_block_impl_0 这是一个函数名这个函数有三个参数 comF 搜索一下又会发现这是一个结构体结构体如下 struct __main_block_impl_0 {struct __block_impl impl;struct __main_block_desc_0* Desc;int a; 可能你会疑惑刚刚说这是一个函数而现在是一个结构体。其实在 c 里面结构体相当于OC的类c 里面结构体拥有自己的属性以及构造方法和方法。那么为什么取一个结构体的地址呢 其实它取得是下面这段代码的地址 __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int flags0) : a(_a) {impl.isa _NSConcreteStackBlock;impl.Flags flags;impl.FuncPtr fp;Desc desc;} 那么在上面个方法实现里又有四个参数。而在刚刚调用的时候只有三个参数多了一个参数 flags 0这个参数其实就相当于Swift中指定了一个默认值不传也有值可以忽略。那么后面继续 a(_a) : 在 c 里面 指定_a(形参) 将来赋值给a 这个实参也就是这个__main_block_impl_0 结构体中的 int a;在这里 int a 10; impl.FuncPtr fp; 将fp赋值给了 impl 结构体的 FuncPtr 参数, 在这个参数里面存放的是下面这段代码的地址 static void __main_block_func_0(struct __main_block_impl_0 *__cself) {int a __cself-a; // 这里 int a 10;printf(%d\\\\\\\\n,a); // 打印出a}__main_block_desc_0_DATA com F 搜索 定义的就是与大小相关的信息代码如下static struct __main_block_desc_0 {size_t reserved;size_t Block_size;} __main_block_desc_0_DATA { 0, sizeof(struct __main_block_impl_0)}; a 直接放a 其实就相当于把a 当前的值拿过来如果是a, 就是a的地址。请看下图 接下来又重新给 a赋值为 20但是Block 最终要找到 FuncPtr 里面存放的是值来执行 在这里才会最终执行打印a 的值的代码但是这段代码里 a 是 10 了。所以最终打印的还是10。 最后可以概括为block 底层实现 分两种刚刚上面的就是第一种不加__block), 会创建一个结构体实现构造方法来接收三个参数。 接下来看加上__block 的实现。 修改我们的代码: 再次在终端里面进行编译你会发现生成的结构体会变化。 等号左边会封装一个__Block_byref_a_0 结构体类型的变量a下面是结构体的声明 truct __Block_byref_a_0 {void *__isa; //isa 类型的指针 自己的类型__Block_byref_a_0 *__forwarding; //与自己结构体同名是一个自己类型的结构体的指针存放的是自己的地址int __flags; // 标记int __size; // 类型的大小int a; // a 属性 保存变量的值}; 等号右边 {(void*)0,(__Block_byref_a_0 *)a, 0, sizeof(__Block_byref_a_0), 10}; 参数 (void*)0 : 一个指针直接存到isa里面(__Block_byref_a_0 *)a: 强转 存放的是自己的地址0 : 会传给 flagssizeof(__Block_byref_a_0), 10: 类型的大小10: a 的值 仅仅是创建。 这 里仅仅是创建因为使用了__block 所以创建了一个block 类型的结构体接下来会才是调用block你会发现其余参数和第一种实现都一样唯一不同的是再去取值的时候拿到的是结构体的地址只要把地址传递过 去就有了最高的操作权限到时候再去取值就可以取到内存中最新的值。 接下来(a.__forwarding-a) 20; 这句代码是拿到结构体里面的地址去修改a的值为20。 后面再去打印打印的就是内存地址中最新的值所以就是20。 作者Liwjing 地址http://www.jianshu.com/users/8df89a9d8380/latest_articles 转载于:https://www.cnblogs.com/sundaysgarden/p/5602456.html
http://www.huolong8.cn/news/267735/

相关文章:

  • 网站开发到上线的流程锦州网站建设多少钱
  • 深圳公司网页设计推广报价唐山网站关键词优化
  • 上海网站备案管理中心厦门建设网站首页
  • 鄞州区建设局网站wordpress换模版
  • 上地网站制作微信小程序源代码模板
  • 小米路由2 做网站北京个人制作网站
  • 个人网站可以做产品众筹吗移动软件管理的应用场景
  • 哈尔滨微信网站开发怎样在百度上免费做广告
  • 企业建网站品牌怎么将网站权重提上去
  • 威海做网站的哪家好哪个网站可以做代销
  • 租空间做网站网站添加链接
  • 网站运营与推广wordpress主题如何汉化
  • 网站内页做排名互联网产品经理
  • 沙河市建设局网站网站开发软件 d
  • 网站建设年终总结中国建筑网官网防水证书查询
  • 都匀住房与城乡建设部网站保险查询平台
  • 昆明网站建设公司乐网北京ui培训机构排行
  • 招聘网站建设及推广网站移动端推广
  • 广州专业网站建设公司农村自建房设计图大全
  • 雷山网站快速排名博客群 wordpress
  • 佛山免费建站公司做论坛和做网站有什么区别
  • 项城网站设计邢台网站改版定制
  • 网站做淘宝客收入咋样公司网站建设哪家好
  • 河北大型网站建设网站建设验收确认书免费下载
  • 产品网站怎么做超链接让你的静态网站 做后台
  • 网站取源用iapp做软件手机wap网站建设解决方案
  • 怎么做网站注册名密码电商运营网
  • 网站改版会影响排名吗怎样注册一个网站平台
  • wordpress 多站点教程全国封城名单
  • 老网站用新域名广州昨天发生重大新闻