iOS技术汇总
iOS技术汇总
絮语时光
移动应用开发
展开
-
iOS Block底层原理
block本质上也是一个OC对象block 内部的isa指针继承自 NSObject,即可证明 block 即 OC 对象block 是封装了函数调用以及函数调用环境的OC对象1,定义一个blockint main(int argc, char * argv[]) { void (^myBlock)(void)=^{ NSLog(@"===="); }; myBlock(); return 0;}使用如下方式转换成cppxcrun -sdk原创 2022-01-14 10:51:25 · 2299 阅读 · 0 评论 -
iOS对象销毁,释放Dealloc
1、对象销毁时会调用dealloc方法,方法内部调用_objc_rootDealloc函数- (void)dealloc { _objc_rootDealloc(self);}2、_objc_rootDealloc函数内部调用了对象的rootDealloc函数void_objc_rootDealloc(id obj){ assert(obj); obj->rootDealloc();}3、rootDealloc函数释放对象,分两种情况快速销毁和正常销毁原创 2022-01-09 16:55:10 · 2122 阅读 · 0 评论 -
iOS的引用计数减1
对象释放时,调用这个方法把引用计数0ALWAYS_INLINE bool objc_object::rootRelease(bool performDealloc, bool handleUnderflow){ if (isTaggedPointer()) return false; bool sideTableLocked = false; isa_t oldisa; isa_t newisa; retry: do { oldisa原创 2022-01-09 16:06:43 · 637 阅读 · 0 评论 -
iOS对象创建过程
1、调用alloc函数,内部调用了_objc_rootAlloc函数,并传入self参数,self其实是isa,也就是类对象+ (id)alloc { return _objc_rootAlloc(self);}2、_objc_rootAlloc函数调用了callAllocid_objc_rootAlloc(Class cls){ return callAlloc(cls, false/*checkNil*/, true/*allocWithZone*/);}3、call原创 2022-01-09 15:16:05 · 577 阅读 · 0 评论 -
iOS的isa指针
isa指针是什么?isa指针指向的是类对象,类对象全局只有一个,因此每个类创建出来的对象都会保存类对象的地址,也就是isa,通过isa就可以查询到这个对象的属性和方法,协议等;isa数据结构如下:可以看出isa是一个联合体类型的数据;属性有Class 类型指针cls,和uint类型的bits,以及结构体;可以看出这个联合体isa的内存是8个字节union isa_t { isa_t() { } isa_t(uintptr_t value) : bits(value) { }原创 2022-01-09 14:47:44 · 2195 阅读 · 0 评论 -
iOS自动释放池AutoreleasePool
介绍iOS的自动释放池原理,把底层的方法分析一遍,并给每个方法都添加了注释我们一般使用自动释放池是直接使用@autoreleasePool方法,如下底层会帮我们再次翻译成另一种形式int main(int argc, const char * argv[]) { @autoreleasePool{ } return 0;}底层会翻译成这样创建一个局部变量接收push函数的返回值,查看objc_autoreleasePoolPush和o原创 2022-01-09 14:04:55 · 1012 阅读 · 0 评论 -
iOS弱引用表 SideTable weak_table_t weak_entry_t
一、DisguisedPtr伪装指针类介绍主要是用来把对象的指针映射到long类型的数值,来保存对象的指针,至于为什么不直接保存指针,估计是处于安全考虑,防止空指针造成的坏的影响;地层大量使用了DisguisedPtr,DisguisedPtr也不是很复杂;可以看出DisguisedPtr是个模版类,可以看作是iOS中的范型,里面定义了一个属性value,用来保存处理后的对象指针;是个unsigned long类型,和其他几个函数;template <typename T>cla原创 2022-01-07 14:34:50 · 1022 阅读 · 0 评论 -
iOS OpenGl ES着色器
首先创建两个文件分别为simple.frag和simple.vertsimple.frag内容const char* SimpleFragmentShader = STRINGIFY(varying lowp vec4 DestinationColor;void main(void){ gl_FragColor = DestinationColor;});simple.vert内容const char* SimpleVertexShader = STRINGIFY(.原创 2021-12-27 10:31:13 · 1897 阅读 · 0 评论 -
RGB转YUV
YUV常见格式是以下四种,其他的格式自行搜索,以下是转换方法I420: YYYYYYYY UU VV =>YUV420PYV12: YYYYYYYY VV UU =>YUV420PNV12: YYYYYYYY UVUV =>YUV420SPNV21: YYYYYYYY VUVU =>YUV420SP以下转换方法是RGBA的像素格式,如果是ARGB,RGB,BGR等,自行去转换,或者调整方法;I420: YYYYYYYY UU VV =>YUV420P转换方法ch原创 2021-12-17 09:58:04 · 1105 阅读 · 0 评论 -
YUV数据格式
YUV存储方式YUV存储方式主要分为两种:Packeted 和 Planar。Packeted方式类似RGB的存储方式,以像素矩阵为存储方式。Planar方式将YUV分量分别存储到矩阵,每一个分量矩阵称为一个平面。YUV420即以平面方式存储,色度抽样为4:2:0的色彩编码格式。其中YUV420P为三平面存储,YUV420SP为两平面存储。常用的I420(YUV420P),NV12(YUV420SP),YV12(YUV420P),NV21(YUV420SP)等都是属于YUV420,NV12是一种两原创 2021-12-16 19:28:21 · 778 阅读 · 0 评论 -
image与RGB互相转换
Get data from a image较简单,根据已有的 image 的属性,创建 CGBitmapContext, 这个 context 是带有直接访问的指针的。然后将 Image 绘制到这个 context, 得到裸数据。 CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(srcImg.CGImage); CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceRGB(); fl原创 2021-12-15 15:33:43 · 446 阅读 · 0 评论 -
UIimage转视频
/** * 裁剪图片 * * @param image 图片 * @param bounds 大小 * */+ (UIImage *)croppedImage:(UIImage *)image bounds:(CGRect)bounds{ CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], bounds); UIImage *croppedImage = [UIImage imageW原创 2021-12-10 20:31:45 · 91 阅读 · 0 评论 -
UIImage截图旋转
截取的方式一一开始因为对UIGraphics的方法不怎么熟悉,以为只能对UIView的整个截屏。于是就弄出了这种截取部分图片的方式,就是用CropView包住ImageView然后截取CropView。虽然效果也还不错也能满足一些需求,但是这样的截图变得不高清,所以最后放弃了用它。/// 截图 + (UIImage *)cropImageWithOldImage:(UIImage *)image OldFrame:(CGRect)oldFrame CropFrame:(CGRect)cropFrame原创 2021-12-10 20:29:27 · 119 阅读 · 0 评论 -
IOS UIview截图
UIview截图(UIImage *)captureScreen {UIGraphicsBeginImageContextWithOptions(self.frame.size, YES, 0.0f);[self.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();原创 2021-12-10 20:24:11 · 469 阅读 · 0 评论 -
Object-C ,runtime原理,oc对象的原理,oc对象在底层的实现原理
Object-C-runtimeObject-C ,runtime原理,oc对象的原理,主要记录oc对象在底层的实现原理;项目代码地址GitHub//// Person.m// Interview001-OC对象的本质//// Created by xingye yang on 2021/9/18.// Copyright © 2021 xingye. All rights reserved.//#import "Person.h"#import <objc/runti原创 2021-09-18 15:51:55 · 97 阅读 · 0 评论 -
iOS自动布局NSLayoutConstraint
iOS自动布局NSLayoutConstraint(1)自动布局使用可视化语言:VFL(Visual Format Language)[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20@500-[_view1(==_view2)]-space-[_view2(==_view1)]-40-|"options:NSLayoutFormatDirectionLeftToRightmetrics:@{@"space":@20}views:NS原创 2021-01-18 10:44:53 · 387 阅读 · 0 评论 -
ios 删除SceneDelegate.h
直接删除SceneDelegate.h 和SceneDelegate.m文件,在appDelegate.h中加上@property (strong, nonatomic) UIWindow * window;在appDelegate.h中删掉SceneDelegate的代理方法最后在info.plist文件中移除Application Scene Manifest原创 2021-01-13 16:12:51 · 575 阅读 · 0 评论 -
GCD队列组
GCD队列组有时候我们会有这样的需求:分别异步执行2个耗时操作,然后当2个耗时操作都执行完毕后再回到主线程执行操作。这时候我们可以用到GCD的队列组,我们可以先把任务放到队列中,然后将队列放入队列组中,调用队列组的dispatch_group_notify回到主线程执行操作- (void)queueGroup{ //创建队列组 dispatch_group_t que原创 2017-08-23 15:54:56 · 298 阅读 · 0 评论 -
gcd单例类
我们在创建单例、或者有整个程序运行过程中只执行一次的代码时,我们就用到了GCD的dispatch_once方法。使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次- (void)gcdShareInstance{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{原创 2017-08-23 15:52:15 · 182 阅读 · 0 评论 -
gcd 延时方法
延时方法- (void)gcdDelyMethod{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"延迟2秒执行--%@",[NSThread currentThread]);原创 2017-08-23 15:50:27 · 228 阅读 · 0 评论 -
gcd 栅栏操作
GCD 的珊栏方法我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作。这样我们就需要一个相当于栅栏一样的一个方法将两组异步执行的操作组给分割起来,当然这里的操作组里可以包含一个或多个任务。这就需要用到dispatch_barrier_async方法在两个操作组间形成栅栏- (void)gcdBarrier{ // 创建队列 dispatc原创 2017-08-23 15:48:56 · 1479 阅读 · 0 评论 -
iOS ipv4和ipv6转换
关于ip地址主要是ipv4转换成ipv6的解决办法 以前的坑:以前也遇到过关于ipv6审核被拒绝的问题,公司给的服务器地址是ip地址,不是域名,所以在苹果审核的时候遇到了ipv6的问题,如果是域名的话问题很容易解决,不过最终还是找到了解决办法,在此分享给大家。前提是我的项目都是用tcp做网络通信,没有用到http,所以我的项目用到了这个GCDAsyn原创 2017-08-10 09:56:54 · 5085 阅读 · 0 评论 -
获取视频缩略图
缩略图AVAeest AVPlayerNSMutableDictionary * headers = [NSMutableDictionary dictionary]; [headers setObject:@"yourHeader"forKey:@"User-Agent"]; self.urlAsset = [AVURLAsset URLAssetWithURL:self.videoUR...原创 2018-08-07 21:18:13 · 721 阅读 · 0 评论 -
FFMpeg解H264压缩rtsp协议流媒体
http://www.cocoachina.com/bbs/read.php?tid-283773.html原创 2017-11-03 15:56:45 · 1052 阅读 · 0 评论 -
记录两个bug
1)xcode 出现 errsecinternalcomponent使用真机跑项目时突然报错,郁闷。再网上找了这个办法:原因: 这似乎是签名机制(code signing mechanism) 的 bug, Xcode 中账号多了,就会产生很多过期的PP文件,Xcode 没有自带删除功能会导致重复导入provisioning profile.解决办法: Xcode 中所有的...原创 2018-09-15 14:43:37 · 307 阅读 · 0 评论 -
iOS cocoapods 组件化
https://github.com/xuyushiguang/HJSpecs.githttps://github.com/xuyushiguang/HJPodTestLib.git查看reposcd ~/.cocoapods/repos创建spec索引$ pod repo add HJSpecs https://github.com/xuyushiguang/HJSpec...原创 2018-09-05 11:22:02 · 809 阅读 · 0 评论 -
Mac 终端使用
1.cd . 表示当前目录cd .. 表示返回上一级目录cd ../.. 表示返回上两级cd ../.. /.. 表示返回上三级目录cd + 空格 + 下一目录 表示将从当前路径进入到下一目录cd + 空格 + ~ 表示从当前目录进入到...原创 2018-08-20 14:53:51 · 410 阅读 · 0 评论 -
获取手机的指南针和行进方向
Core Location支持两种方式去获取方位相关的信息:heading:有磁力计的设备可以获得指南针方向.course:有GPS的设备可以获取设备的行进方向和速度.加入方向相关的事件在info.plist里加入UIRequiredDeviceCapabilities相关的键:magnetometer:磁力计,获取heading信息 gps:获取course信息.获取He...原创 2018-07-09 10:09:48 · 1837 阅读 · 1 评论 -
iOS headerdoc 代码注释打包sdk
有时候我们需要封装sdk给其他人使用,现在我们可以这样做把你的注释包含在 /*! – */块里打开终端先cd 你要打包注释的项目cd /Users/yxy/Desktop/KM34Project 输入 headerdoc2html -o OutputDirectory InputDirectoryOutputDirectory是要输出的那个文件路径,我们在桌面上原创 2017-10-18 21:44:46 · 593 阅读 · 0 评论 -
P3图片导致iOS9.3以下崩溃问题
背景最近公司项目集成了Bugtags,发现线上版本奔溃概率达到了2%,怪不得AppStore评论里有人在【骂娘】。主要问题是有一个Signal 10 was raised. SIGBUS (_mh_execute_header + 795252)的bug,但在奔溃堆栈中查不到有用信息。从统计数据中发现,奔溃大多出现在iOS9.0-iOS9.3之间的版本。找手机一波三折发原创 2017-10-10 09:41:45 · 1433 阅读 · 0 评论 -
IOS常见问题之:clang: error: no such file or directory
IOS常见问题之:clang: error: no such file or directory内容:clang: error: no such file or directory: main.m’ clang: error: no input files这个是因为资源找不到的原因,解决方法选择project > Build Phases >打开 “Co原创 2017-09-25 14:41:00 · 2478 阅读 · 0 评论 -
xcode9无线调试都在这里
xcode9可以无线调试了,小伙伴们都来看这里。首先必备条件,Mac os版本 10.12.6;ios 11;xcode9;注意手机和电脑必须是同一个局域网才可以,我试一下如果不在同一个局域网是不能进行调试的。下面开始讲解怎样配置无线调试,其实很简单。第一步:用数据线把手机和电脑先链接起来。打开xcode。选择window->devices and simulato原创 2017-09-21 09:50:05 · 2734 阅读 · 0 评论 -
cocos2d-iphone编译
cocos2d-iphone是由OC语言编写的,cocos2d-X是由C++语言编写的(多平台平移),两者除语言外,基本差别不大。 2》Dash工具(集API文档浏览和代码片段管理工具)可以查看相关cocos2d-iphone文档。 3》cocos2d源码并没有使用ARC,最好的解决方案就是将cocos2d代码添加为静态库 步骤:(1)查看Targ原创 2017-08-30 09:49:01 · 424 阅读 · 2 评论 -
友盟崩溃日志分析
对于友盟提供的如下崩溃报告,很难看出是什么地方出了问题,接下来我们一步步通过dsym文件解析崩溃原因; 下面的崩溃报告中的app名称我用appname代替Application received signal SIGSEGV (null) (( 0 CoreFoundation 0x000000018236d1d0 + 148原创 2017-08-29 12:06:27 · 3859 阅读 · 0 评论 -
DSYMTools
https://github.com/answer-huang/dSYMToolshttp://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73261868d462e8ec814c0735b36163bbca67c7f5119d3c77f6102af4a57f7原创 2017-08-25 21:19:21 · 383 阅读 · 0 评论 -
cocos2d环境搭建for ios
首先 下载Cocos2d-x库地址:http://www.cocos2d-x.org/download。Cocos2d-x目前有2个大版本:v3.9和v2.2.6,cocos2d有两个版本一个是v3.x,另一个是v2.x创建项目:(1)使用命令行创建Cocos2d-x项目。(2)Cocos2d-x目前的2个大版本创建方式不同。所以以下针对不同版本分别原创 2017-08-25 15:19:10 · 265 阅读 · 0 评论 -
日志分析
http://www.cocoachina.com/industry/20130725/6677.html原创 2017-08-24 08:53:45 · 181 阅读 · 0 评论 -
symbolicatecrash
本文介绍了如何解析 iOS 的 crash 堆栈,分别使用了 symbolicatecrash 来自动解析整个堆栈,以及使用 atos 来解析单个地址的符号。在 iOS 开发中,解决 crash 问题是比较常见的工作。其中能够解析出符号当然是定位问题的开始。实际工作中,也有看到很多人其实会卡在解析符号这里,遇到这种情况,可以按照本文中的做法解决。使用 symbolicatecrash原创 2017-08-23 20:42:29 · 282 阅读 · 0 评论 -
创建动态库
http://lib.csdn.net/article/swift/67800?knId=4原创 2017-08-23 11:21:34 · 159 阅读 · 0 评论 -
app测试工具
http://lib.csdn.net/article/swift/68037?knId=3原创 2017-08-23 11:06:40 · 232 阅读 · 0 评论