纳兰若水


  • 首页

  • 归档

  • 分类

  • 标签

block 探索

发表于 2019-02-10

block 转 c++ 源码

如下代码 .h .m文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//TestClang.h
@interface TestClang : NSObject
+ (void)testBlcok;
@end

//TestClang.m
#import "TestClang.h"
static int numGlobel = 29;
@implementation TestClang
+ (void)testBlcok {
//没有截获局部变量 __NSGlobalBlock__
void(^block1)(void) = ^{
NSLog(@"just a block");
    };
NSLog(@" block1 = %@", block1);
block1();
static int numStatic = 12;
int num = 10;
__block int numBlock = 19;
__block int numBlock2 = 30;
__block int numBlockTest = 30;
    void(^block2)(void) = ^{
NSLog(@"just a block === %d, numStatic = %d numGlobel = %d numBlock=%d numBlock2=%d numBlockTest = %d", num,numStatic,numGlobel,numBlock,numBlock2,numBlockTest);
    };
num = 33;
numStatic = 121;
numGlobel = 129;
numBlock = 22222;
block2();
NSLog(@"block2 = %@", block2);
}
@end

执行:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc TestClang.m
不要引用其他头文件,以免导出报Error
目录下生成了一个TestClang.cpp文件

  • testBlock 对应的方法变为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//_C_ 表示为类方法 _I_ 为实例方法
static void _C_TestClang_testBlcok(Class self, SEL _cmd) {

void(*block1)(void) = ((void (*)())&__TestClang__testBlcok_block_impl_0((void *)__TestClang__testBlcok_block_func_0, &__TestClang__testBlcok_block_desc_0_DATA));
NSLog((NSString *)&__NSConstantStringImpl__var_folders_nc_qvb_bh854tz1y0p1hdk5y6km0000gn_T_TestClang_cf514e_mi_1, block1);
((void (*)(__block_impl *))((__block_impl *)block1)->FuncPtr)((__block_impl *)block1);
static int numStatic = 12;
int num = 10;
__attribute__((__blocks__(byref))) __Block_byref_numBlock_0 numBlock = {(void*)0,(__Block_byref_numBlock_0 *)&numBlock, 0, sizeof(__Block_byref_numBlock_0), 19};
__attribute__((__blocks__(byref))) __Block_byref_numBlock2_1 numBlock2 = {(void*)0,(__Block_byref_numBlock2_1 *)&numBlock2, 0, sizeof(__Block_byref_numBlock2_1), 30};
__attribute__((__blocks__(byref))) __Block_byref_numBlockTest_2 numBlockTest = {(void*)0,(__Block_byref_numBlockTest_2 *)&numBlockTest, 0, sizeof(__Block_byref_numBlockTest_2), 30};

    void(*block2)(void) = ((void (*)())&__TestClang__testBlcok_block_impl_1((void *)__TestClang__testBlcok_block_func_1, &__TestClang__testBlcok_block_desc_1_DATA, num, &numStatic, (__Block_byref_numBlock_0 *)&numBlock, (__Block_byref_numBlock2_1 *)&numBlock2, (__Block_byref_numBlockTest_2 *)&numBlockTest, 570425344));
num = 33;
numStatic = 121;
numGlobel = 129;
(numBlock.__forwarding->numBlock) = 22222;
((void (*)(__block_impl *))((__block_impl *)block2)->FuncPtr)((__block_impl *)block2);
NSLog((NSString *)&__NSConstantStringImpl__var_folders_nc_qvb_bh854tz1y0p1hdk5y6km0000gn_T_TestClang_cf514e_mi_3, block2);
}
阅读全文 »

武功山游记

发表于 2018-12-31 | 分类于 游记

续:2018年12月31日,雪后,不一样的武功山~

一直想去看冬季的武功山,期待满山白雪皑皑,雪景连接云海。何等壮观。我提出冬季上武功山露营,一家人心痒痒,但是担心大雪封山,临回家才确定上山。但是考虑到露营太冷,改为山脚景区泡温泉,次日上山。抵达景区温泉还下着雪,就着雪泡温泉的感觉真是冰火两重天。泡够时间就 “落荒而逃” ~

次日9点到达武功山脚下,买好门票缆车票。得知山中 -6℃ ,又买好口罩手套等。脚踩防滑链,踏着积雪,向着被白雪覆盖的武功山前进。

阅读全文 »

on-demand 资源下发

发表于 2018-12-06 | 分类于 功能设计

Apple On-Demand Resource

Xcode 可以给资源打 tag,被打 tag 的资源在打包时不会打到包内。需要时下载,测试时可以使用自己的服务器,但是发布到 AppStore 时需要托管到苹果的服务器。
苹果的 On-Demand Resource 文档

自建资源下发模块

了解到了苹果 On-Demand Resource 机制,我们可以结合Resource Tags 下的资源不会打包到 ipa 包的特性。设计一套自己的下发机制。

阅读全文 »

xcodeproj

发表于 2018-11-30 | 分类于 工具

xcodeproj

xcodeproj 实际上是一个文件夹,打开后可以看到 project.pbxproj, xcuserdata, project.xcworkspace.

  • project.pbxproj: “在 project 里的 project”,是 xcodeproj 最主要的文件
  • project.xcworkspace: 一个子文件夹,存储了用户 workspace 的相关信息
  • xcuserdata: 另外一个文件夹,里面也是用户相关的一些信息
阅读全文 »

冲绳四日三晚游记

发表于 2018-09-11 | 分类于 游记

行程时间: 9月7日 - 9月10日
提前一个月的时间定了吉祥航空的往返航班,2700左右/人。出发时下午5点,回程是下午7点。
行程酒店:美国村门巴公寓酒店,酒店外就是沙滩。
冲绳9月份是台风季,天气说不准,最好提前做下攻略。

Day 1

启程,第一天出发的时间是北京时间5点,到冲绳大概2个小时,不过因为冲绳是早一个小时的,所以到冲绳是当地时间晚上8点了。预订的接机去美国村的酒店,400RMB。
抵达冲绳从机场出来就感觉非常干净,各种建筑街道啥的都非常干净,各种基础设施做的也很贴心。约的日本的司机来接机的,人很有礼貌,会一点英语, 大概花了50分钟左右到美国村。入住之后就去觅食,找到了上一波推荐去的一家叫 xx食堂的店,吃了猪豚骨饭,另外在冲绳大众点评也挺好用(^__^)。
美国村夜景

阅读全文 »

Recording Animation

发表于 2018-08-22 | 分类于 技术

记录一次录音动画实现

需求:根据音量大小实现一个录音波形动画,因为拿到的音量大小在10-30之间,所以会已30为最大值。其实未录音和录音之后会有另外的lottie动画,再此记录的只是录音中的动画。

demo 地址

渐变圆环实现记录

发表于 2018-07-02 | 分类于 技术

先了解下坐标系
iOS layer坐标系
position属性是决定子layer在父layer上的位置,默认为(0,0)。其次,anchorPoint属性是决定子layer上的哪个点会在position所指定的位置。

阅读全文 »

度户外九龙大峡谷徒步

发表于 2018-05-19 | 分类于 游记

有其他小伙伴写了游记,这里做个记录~ (^__^) 嘻嘻……
度户外·半满白草畔

故宫-长城两日游攻略

发表于 2018-05-14 | 分类于 游记

时间: 5月12日、5月13日 (非高峰期)
购票方式:
故宫:网上购门票 + 珍宝馆 + 珠宝馆 78元/人,直接刷身份证进入。
八达岭长城:网上购大门票 + 往返直通车 87元/人

故宫

特别注意需要提前准备的:
1:下载一个故宫的讲解App(故宫博物馆三毛游)不知道还有没有其他好用的,没有特别去筛选。完了就预先下载好所有的讲解音频文件,这个app解锁所有的讲解需要15元,在到达不同地点会自动播放相应的讲解,还能看见当前的位置,真的是东西南北都分不清的路痴的福音。回来的时候还听到一个妹纸说找不到钟表馆啊,票白买啦!!(^__^) 嘻嘻……,所以下个辅助App还是很方便的。不然得去租故宫的电子讲解器(20元),人比较多,而且走的时候还要还。
2:携带中午的午餐,补充体力
3:充电宝

阅读全文 »

algorithms

发表于 2018-05-09 | 分类于 技术

记录算法学习的进度和一些实现代码(Objective-C)
开始算法的学习

求p和q的最大公约数

1
2
3
4
5
6
7
8
9
//计算两个非负整数p和q的最大公约数,若q是0,则最大公约数为p,否则将p除以q的余数为r,则p和q的最大公约数为q的和r的最大公约数
- (int)maxDivisorP:(int)p q:(int) q {
if(q == 0) {
return p;
}
int r = p % q;
NSLog(@"p is %d, q is %d",p,q);
return [self maxDivisorP:q q:r];
}

牛顿迭代法:通俗易懂的讲解

1234
纳兰若水

纳兰若水

随便写写读书笔记、技术学习、随想、生活、游记

36 日志
12 分类
8 标签
RSS
GitHub Twitter
© 2017 — 2022 纳兰若水
由 Hexo 强力驱动
|
主题 — NexT.Pisces