- 博客(91)
- 问答 (1)
- 收藏
- 关注
原创 【Flutter】02:Dart基础语法
前言:前边配置好了环境,接下来学习flutter开发的语言,dart。一、查看Dart版本查看dart位置二、创建Dart工程先来创建个空的选择工程存放位置。设置好sdk的位置。设置Module名称。打开demo1.dart就可以看到类似OC工程里main文件的文件了。‘control + r ’ 即可运行代码,此时是跑在AS软件里的终端上的,未触发到模拟器上,因为属于一个空工程。三、创建flutter工程...
2021-10-22 02:06:37 1268
原创 【Flutter】01:Flutter开发环境配置
目录前言:什么是flutter?一、flutter SDK下载二、配置环境变量三、doctor检测处理1.更新cocoapods2.安装Android Studio3.下载SDK4.安装flutter插件5.license问题5.Java version问题。四、夜神模拟器下载安装五、gradle配置六、创建一个工程看看。七、Android Studio打开flutter八、总结前言:什么是flutter?Flutter是Googl...
2021-10-19 00:41:17 1667
原创 【iOS底层】19:KVC分析
前言:本文章开始分析KVC相关~一、Apple Developer Documentation地址:传送门这里就可以查找到kvc相关的苹果官方文档↓二、KVC的设置来结合代码理解一下kvc的setter1.看是否有set<Key> or _set<Key>- (void)viewDidLoad { [super viewDidLoad]; LGPerson *person = [[LGPerson alloc] i..
2021-07-26 17:58:38 260
原创 【iOS底层】14:类的加载原理(上)
前言:从这篇文章开始我们来探索一下类是如何加载到内存中的~一、_objc_init()分析environ_init():环境变量的初始化。点进去看看,方法内部最后有些打印环境变量的地方,我们将这段代码挪到前边还未打印数据之前,并将判断条件去除掉。就是↓这样的那么来打个断点打印一下看看objc[12906]: OBJC_PRINT_IMAGES: log image and library names as they are loadedobjc[12906]:...
2021-07-24 23:35:57 327 5
原创 【iOS底层】13:dyld补充及load、main函数调用探索
前言:上篇文章里探索了dyld的整体流程,还剩一些没有探索,这篇继续收个尾。一、_dyld_objc_notify_register函数参数调用时机上篇文章我们讲到objc源码中有个_objc_init()方法,其中的_dyld_objc_notify_register(&map_images, load_images, unmap_image);方法对镜像文件进行了加载。首个参数相当于下句柄(大概相当于个block),在dyld源码中mapped赋值给了sNotifyO.
2021-07-16 04:53:16 409 1
原创 【iOS底层】12:dyld应用程序加载
前言:从这篇起我们探索下应用程序的加载流程~一、库1.库:可执行的二进制文件,能够被系统加载到内存中。常规的就是静态库(.a),动态库(.dylib)。编译过程流程图:欠着静态链接:可能重复加载动态链接:对内存有优化2.可执行文件拖入终端可运行。二、库的加载dyld链接器!链接流程图:欠着Runtime_dyld_objc_notify_register()map_imagesLoad_imagesmain函数三、dyld探
2021-07-15 23:09:50 289
原创 【iOS底层】11:消息转发
一、msgSend消息发送监听在探索了很多次了lookUpImpOrForward方法中,查找完成后会写入cache在写入cache中发现有个打印log的操作我们来看下是否可以通过这个输出到本地的日志,是否可以查看到一些不一样的流程和我们还没探索过的方法。上图中看到如果想要调用logMessageSend方法,需要满足判断条件:objcMsgLogEnabled && implementer,implementer是我们传入的class,那么影响判断的就只有o..
2021-07-09 16:43:39 288
原创 【iOS底层】10:消息动态决议
一、方法实现缺失报错@interface LGPerson : NSObject- (void)sayHello;+ (void)sayHelloPlus;- (void)sayPerson;+ (void)sayPersonPlus;@end@implementation LGPerson- (void)sayPerson{ NSLog(@"%s",__func__);}+ (void)sayPersonPlus{ NSLog(@"%s",__func__);
2021-07-06 00:21:16 140
原创 【iOS底层】09:objc_msgSend慢速查找
回顾:上边博客分析了objc_msgSend通过receiver和SEL查找到对应imp的过程,这篇我们探索下如果最终未找到imp,执行的__objc_msgSend_uncached这个方法。一、真机跟汇编流程(可以真机调试的小伙伴自行探索)register read x1读各种内存比对,然后验证回顾并加深objc_msgSend流程。二、__objc_msgSend_uncachedSTATIC_ENTRY __objc_msgSend_uncached UNWIND __.
2021-06-30 20:08:34 264
原创 【iOS底层】08:objc_msgSend(下)
回顾:上篇文章我们讲了objc_msgSend(recevier, SEL),以及汇编查看流程objc_msgSend,判断receiver是否存在,存在的话通过receiver获取到isa,继而获取到class。那么这篇文章继续跟汇编流程往下走。一、objc_msgSend汇编查找//上次我们看到这里LGetIsaDone: //获取玩isa以后 调用imp或者objc_msgSend_uncached // calls imp or objc_msgSend_uncached .
2021-06-30 18:43:31 114
原创 【iOS底层】07:objc_msgSend(上)
回顾:上一篇我们分析了cache_t的结构。接下来我们分析下cache之前是谁调用了cache,我们来看下objc_msgSend!一、Runtime了解ojbc_msgSend之前我们先补充下关于Runtime方面的知识。什么是Runtime:编译运行时Runtime是一套底层纯C语言API,OC代码最终都会被编译器转化为运行时代码,通过消息机制决定函数调用方式,这也是OC作为动态语言使用的基础。Runtime有2个版本Legacy(早期版本):用于Objctive-C 1
2021-06-29 23:52:55 360 2
原创 【iOS底层】06:cache_t分析
struct objc_class : objc_object {// Class ISA; Class superclass; cache_t cache; // formerly cache pointer and vtable class_data_bits_t bits; }在分析完了类里的ISA,bits以后,我们来看下另一块比较重要的--cache。一、cache_t数据结构分析我们先从源码来看下cache_t的数据结构:s..
2021-06-28 17:50:56 197
原创 【iOS底层】05:类原理分析(下)
目录回顾:一、属性、成员变量、实例变量的区别二、sel&imp 编码表补充三、setter方法底层原理四、类方法存储API方式解析五、isKindOfClass面试题分析六、总结回顾:.objc_object 和 objc_class是继承关系,class继承自object。.像person和NSObject,person和objc_object没有继承等关系,只是一个上层,一个底层,然后NSObject是按照objc_class的模板创建的。.id 是
2021-06-25 02:54:26 454 1
原创 【iOS底层】04:类原理分析(上)
目录一、元类二、lldb调试分析isa走向三、指针平移四、类结构分析需要注意的是objc_class有三处创建:我们着重看看cache_t这个结构体的大小:五、bits数据查看lldb探究bits数据如下过程:*类的方法获取:六、成员变量和类方法的查找*查找类方法+ (void)sayGoodbye;我们终于找到类方法+ (void)sayGoodbye;了七、总结一、元类经典原理图:二、lldb调试分析isa走向从上篇博...
2021-06-23 01:43:53 787 2
原创 【iOS底层】03:对象的本质及isa结构
一、对象的本质Clang:Clang是一个有Apple主导编写的,基于LLVM的C/C++/Objective-C编译器。功能比gcc更强。对象在底层被编译成一个结构体。二、联合体(union) 位域参考文章:https://blog.csdn.net/whahu1989/article/details/84575558?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMa...
2021-06-16 12:04:29 177
原创 【iOS底层】01:alloc探索及流程分析
一、底层探索分析的三种方法方法一:直接添加符号断点。方法二:打了普通断点以后,跑到断点处,按住control,step into,进去后查看到调用方法名,将方法名添加一个符号断点,再执行即可查找到底层库。方法三:打了普通断点以后,跑到断点处,点击顶部Debug—Debug Workflow — Always Show Dissassembly(汇编);再下一行找到方法名打断点,然后再step into。二、编译器优化Project中 Build Setting,搜索op...
2021-06-15 23:01:28 157 1
原创 联合体、位域
本文参考自:https://blog.csdn.net/whahu1989/article/details/84575558?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.vipsorttest&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7
2021-05-10 16:50:27 1303
原创 Xcode如何自定义代码块
前言:在项目开发中我们常常会需要编写重复性的代码,比如创建各种属性、tableView的各种代理方法、初始化方法,如果每个属性每个方法都手打一遍的话,无疑会浪费我们很多宝贵时间,那么Xcode提供的自定义代码块功能就能完美解决了这一困扰,那么该如何自定义代码块呢?废话不多说,直接开整!正文:1.我们以Xcode12.4为例,代码块由早期的右侧展示区的底部,移到了顶部的右上角,显示一个➕点击以后会弹出一个窗口如下图*User列表里代表的就是用户自定义的代码块儿,剩下的都是系统自带的代码
2021-05-08 21:55:13 690
原创 Go2Shell的安装与配置
前言:在了解并安装了iTerm2以后,又发现了一个好用的小工具,Go2Shell,那么它有什么用呢?它可以实现在你打开的文件夹下直接跳转到终端的当前目录下,更方面的让我们对当前文件夹下的文件进行终端下的操作。这个配置相对比较简单,我们来操作一下~一、下载地址:https://zipzapmac.com/Go2Shell因为APP Store版本的Go2Shell已经不维护了,我们直接去官网下载。点击FREE DOWNLOAD下载并安装到Application里即可。二、配置安
2021-04-25 15:10:24 900 4
原创 mac下iTerm2和oh-my-zsh安装教程
前言:最近接触到了一个终端软件iTerm2,据说功能很强大,比原生的终端要好用,所以打算搞一下用用看,结果按照网上的教程安装,困难重重啊,各种报错,于是记录下来我的安装过程及错误解决方法,希望能帮助到其它小伙伴更顺利的安装上该软件。废话少说,下面开始~先来看看效果图:一、安装iTerm2下载地址:https://iterm2.com/downloads.html前往官网下载并安装即可,安装完成后会提示是否移到Application里,点确定就行。二、安装oh-my-zsh.
2021-04-22 19:55:14 1204
原创 【iOS底层】02:内存对齐
先来几个例子struct LGStruct1 { double a; //8 (0-7) char b; //1 (8) int c; //4 (12 13 14 15) 9 10 11都不是4的倍数,弃用,内存对齐,优化读写 short d; //2 (16 17)}struct1;//最终需要16+8?该结构体中成员变量最大的是8,所以+8。struct LGStruct2 { double a; //8 (0-7) ...
2021-04-20 18:46:17 88
原创 objc4-787.1源码编译调试避坑
由于最近在看iOS底层原理的东西,于是想把objc的源码下载下来编译调试,但是过程是曲折的,下载下来以后遇到了各种问题,现贴出来解决过程,也帮助各位同样想编译调试objc源码的小伙伴更快的运行起来,话不多说,开始吧~■首先,要先把objc4的源码下载下来,这里贴个网址:https://opensource.apple.com根据自己的mac电脑系统版本选择对应的链接点进去,我的是10.15.7,就选择10.15.6就好了~进入后command+f 搜索 “objc4”点击右侧下载即可。
2021-04-13 12:05:14 429 2
原创 iOS UISwitch缩放及布局的坑
如题,应设计要求,默认的switch大小不符合设计要求,所以对switch进行了缩放,方法如下:switch.transfrom =CGAffineTransformMakeScale(0.863, 0.863);如上代码,大小缩放为了原来尺寸的0.863倍。but..... 坑来了switch是放在cell中右侧,在进行布局的时候,layoutSubviews里设置了switc...
2019-09-23 14:58:47 1828
原创 初识Masonry,总结简单使用方法
前情:因项目多人开发,决定弃用xib了,所以改用Masonry来进行AutoLayout布局,这里简单总结下使用方法。*常用方法:label为例:[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.top.mas_equalTo(20); make....
2019-04-26 15:51:03 1422
原创 git管理工具sourceTree使用问题总结
一、其他同事更改了其分支名称名同步到了远端,导致自己这边pull的时候报错error:cannot lock ref 'xx/xxx/xxx' : ref xxx/xxx/xxx is at <hash code1> but except <hash code2>(unable to update local ref)这时候可以选择更新下远端的分支结构,有一些...
2019-04-23 16:24:14 622
原创 UIView与自建Xib关联
因为UIView创建的时候默认是不能同时创建xib的,但是想用xib搭建界面更方便。关联步骤:1.在xcode想创建xib的地方command+n,选择View名字尽量和想要关联的UIView名称保持一致。2.在File's Owner中的第三项Class中输入UIView的名称3.选中xib中自动创建的view,执行与第二步相同的操作,Class中填入UIView...
2019-04-23 16:15:44 727
原创 Xcode10运行旧工程报错multiple commands produce info.plist
如题,Xcode10运行旧工程报错multiple commands produce info.plist,截图如下解决方案:Xcode--File--Workspace Settings ,如下图。打开后将Build System:改为Legacy Build System。保存即可。如下图:...
2019-02-18 16:56:10 214
原创 iOS获取系统文字字号
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; UIFontDescriptor *ctFont = font.fontDescriptor; NSNumber *fontString = [ctFont objectForKey:@"NSFontSizeAttribute"]...
2018-11-14 17:40:55 1998
转载 UIButton放在屏幕底部响应按下延迟
转自:https://blog.csdn.net/haha223545/article/details/80259217第1部分:说明最近在做一个类似微信语音聊天的功能,在屏幕的底部放一个Button,按下时可以语音说话,松开时将语音发出去。但是做的过程中遇到一个坑:按钮放到页面最底部的时候会延迟touchDown事件。第2部分:解决步骤在网上找了一些回答,好多都是说受到Tab...
2018-08-28 15:28:53 494
原创 激活textField后直接选中所有文字
今天遇到个小需求:如果输入框有文字在未激活状态,点击后激活,默认选中所有文字。解决方案:开始尝试了设置textField.selectedTextRange,其start和end值可采用textField.beginningOfDocument和.endOfDocument.但是这两个值是只读的,查询未果后发现另外一个方法,只需一行代码,尝试后可行,现分享给大家:[self.textField p...
2018-06-12 16:02:12 2287
原创 关于textField输入光标颜色及cleanButton大小和颜色的设置
光标颜色设置:self.textField.tintColor = [UIColorwhiteColor];右侧的clean按钮:UIButton *clean = [self.textFieldvalueForKey:@"_clearButton"]; //key是固定的[clean setImage:[UIImageimageName
2017-07-28 14:18:24 5156
原创 导航栏背景色、标题颜色以及返回键自定义
1.导航栏背景色设置://设置为半透明self.navigationController.navigationBar.translucent = YES;//设置背景色及透明度[self.navigationController.navigationBarsetBackgroundImage:[UIImageimageWithColor:[UICol
2017-07-25 18:29:45 2114
原创 textField.placeholder的文字颜色修改
//"通过KVC修改占位文字的颜色" [self.textField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];亲测有效~
2017-07-21 11:22:59 308
原创 iOS view无限360度旋转和停止
- (void)rotateView:(UIImageView *)view{ CABasicAnimation *rotationAnimation; rotationAnimation = [CABasicAnimationanimationWithKeyPath:@"transform.rotation.z"]; rotationAnim
2017-04-13 19:52:00 6305
原创 版本号比较方法
在开发中大家应该会遇到版本升级的问题,那么怎么对比版本号呢?特别是有的时候版本号长度还不等如:高版本号为6.8.0 而本地版本号为6.7.0.1如果是一般的位数相等的版本号解决方法可以是:1.去掉版本号中的“.“,然后转成float等数字进行对比即可。2.循环挨个字符对比,遇到不等的即可break;如果是版本号位数不等的情况,上边第二种方法也可以适用,但是稍显繁琐。
2017-03-08 16:28:53 2358
原创 CGRectGet方法解释
CGRectGetHeight返回label本身的高度CGRectGetMinY返回label顶部的坐标CGRectGetMaxY 返回label底部的坐标CGRectGetMinX 返回label左边缘的坐标CGRectGetMaxX 返回label右边缘的坐标CGRectGetMidX表示得到一个frame中心点的X坐标CGRectGetMidY
2017-02-24 10:10:19 631
原创 iOS开发证书及推送证书的生成教程
以下是我自己摸索出来的证书生成过程,如有错误欢迎指正~一、生成开发证书这里的证书包括开发(development)证书和生产(production)证书。1.打开钥匙串访问--》证书助理--》从证书颁发机构请求证书,输入邮箱和常用名,常用名将作为你的密钥名,选择保存到磁盘,名字默认就可以,存到桌面。2.登录苹果的开发者中心,登录自己的开发者账号进入,选择证书。单击这里的
2015-04-21 19:20:51 1048 1
原创 关于VM:CG raster data的释放
项目中用Instrument检测内存的时候发现打开某个页面的时候发现VM:CG raster data这个字段一下涨好几M。找了好久发现和毛玻璃有关,只要在界面关闭时将承载毛玻璃的image = nil即可,小伙伴们试试吧,深层次的原因欢迎大家分享给我~
2015-02-02 17:43:39 3200
原创 如何通过友盟的错误信息分析项目中问题的具体位置
一、你需要找到和友盟上相同版本的Archive文件,位置是xcode-》Windows-》Organizer,找到打包的那一条目,右键Show in Finder-》右键显示包内容-》dSYMs下找到 项目名.app.dSYM,将其拷贝到文件夹A。二、打开友盟,找到错误信息中青色带下划线的内存地址,有时候会有2个,用上边的那一个,如下图的0xb1d51。三、打开终端
2015-01-26 10:11:23 686
空空如也
iOS内存无限增长,ImageIO_JPEG_Data
2015-01-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人