iOS
南城同学
这个作者很懒,什么都没留下…
展开
-
Share Extension 屏蔽掉自己的app
原文:Hiding Your Action and Share Extensions In Your Own Apps<key>NSExtensionAttributes</key><dict> <key>NSExtensionActivationRule</key> <string> SUBQUERY ( extensionItems, $extensionItem,转载 2021-01-26 15:48:39 · 430 阅读 · 0 评论 -
Swift5.0笔记 - 6.结构体
1. 结构体在 Swift 标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分比如Bool、Int、Double、 String、Array、Dictionary等常见类型都是结构体① struct Date { ② var year: Int③ var month: Int④ var day: Int⑤ } ⑥ var date = Date(year: 2019, month: 6, day: 23) n所有的结构体都有一个编译器自动生成的初始化器(initiali原创 2021-01-04 09:04:05 · 207 阅读 · 0 评论 -
Swift5.0笔记 - 5. 可选项(Optional)
1) 定义常规方式字面量置为nil,会报错;可选项,一般也叫可选类型,它允许将值设置为nil;在类型名称后面加个问号 ? 来定义一个可选项;var name: String? = "Bob"name = nilvar age01: Int? // 可选值默认就是nilage = 10age = nilvar age02: Int //没有初始值应用一:数组越界var array = [1, 15, 40, 29]func get(_ index: Int) -&g原创 2020-11-13 09:03:29 · 276 阅读 · 0 评论 -
Swift5.0笔记 - 4. 枚举
1) 定义enum Direction { case north case south case east case west}或enum Direction { case north, south, east, west}2) 使用var dir = Direction.westdir = Direction.eastdir = .northprint(dir)//nothswitch dir {case .north: pri原创 2020-11-10 08:51:30 · 300 阅读 · 0 评论 -
Swift5.0笔记 - 3. 函数
1. 格式1). 无返回值格式func sayHello() -> Void { print("Hello")}func sayHello() ->() { print("Hello")}func sayHello() { print("Hello")}2). 有返回值格式func sum(v1: Int, v2: Int) -> Int { return v1 + v2}sum(v1:10, v2:20)sum(v1:原创 2020-10-28 09:38:07 · 237 阅读 · 0 评论 -
Swift5.0笔记 - 2. 流程控制
1. if-elseif后面的条件可以省略小括号;条件后面的大括号不可以省略;if后面的条件只能是Bool类型;let age = 4if age >= 22 {}2. whilerepeat-while相当于C语言中的do-whilevar num = 5;while num > 0 { print("num is \(num)") num -= 1}//打印了5次var num01 = 5;repeat { print("num原创 2020-10-27 09:23:03 · 166 阅读 · 0 评论 -
Swift5.0笔记 - 1. 基础语法
1. 书写格式一句代码尾部可以省略“;”,多句代码写到同一行时必须用“;”分开。print("Hello,World");print("test")用var定义变量,let定义常量;编译器可以自动推断出变量、常量的类型。var a = 10a = 20let b = 30print(a)print(b)print("Hello world \(a)")自动判断类型的前提:定义的时候就已经赋值了;let age = 10 否则在定义的时候要指定类型.let a原创 2020-10-22 13:15:29 · 292 阅读 · 0 评论 -
Category实现原理
Category的原理Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息;在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)。无论你创建了多少个分类,分类中有多少对象方法或类方法,程序运行时, 通过runtime动态将分类:对象方法都统一合并到类中;类方法都统一合并到元类中。Category的底层结构:1、当程序编译的时候,Category都会变成如下结构体:str原创 2020-08-19 19:13:54 · 574 阅读 · 0 评论 -
iOS底层原理 - KVC的本质
方法:- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;- (void)setValue:(id)value forKey:(NSString *)key;- (id)valueForKeyPath:(NSString *)keyPath;- (id)valueForKey:(NSString *)key;key和keyPath的区别:-key只能放当前对象的属性,如:“age”;-keyPath可以路径,如:“student.原创 2020-08-14 10:00:24 · 423 阅读 · 0 评论 -
iOS底层原理 - KVO的本质
KVO的本质:本质是重写set方法。1、利用Runtime API 动态生成一个全新的子类,并且让instance对象的isa指向这个全新的子类;2、当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数;函数内部实现:- willChangeValueForKey:父类原来的setter- didChangeValueForKey:didChangeValueForKey:内部会触发监听器(Oberser)的监听方法( o原创 2020-08-12 11:24:45 · 227 阅读 · 0 评论 -
OC对象的本质
对象的本质OC对象的本质是结构体,结构体内部是一个指针;1、引申:一个OC对象最少占用几个字节?一个指针占用8个字节,但是Foundation 框架硬性规定:分配内存时,一个对象最少会分配16个字节;函数:malloc_size ()(allocwithZone—createInstanceFromZone— cls->instanceSize。 一旦发现分配内存小于16,就把它变成16.)遵循内存对其原则,分配的内存都为16的倍数。对象:iOS对象分为实例对象、类对象、元类对象。原创 2020-08-10 10:59:02 · 452 阅读 · 0 评论 -
iOS性能优化 - 启动优化
APP的启动可以分为2种冷启动(Cold Launch):从零开始启动APP;热启动(Warm Launch):APP已经在内存中,在后台存活着,再次点击图标启动APP。APP启动时间的优化,主要是针对冷启动进行优化通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments)DYLD_PRINT_STATISTICS设置为1;如果需要更详细的信息,那就将DYLD_PRINT_STATISTICS_DETAILS设置为1。原创 2020-06-16 10:40:21 · 749 阅读 · 0 评论 -
iOS性能优化 - 耗电优化
耗电来源:CPU处理;网络;定位;图像。如何优化:1. 尽可能降低CPU、GPU功耗;2. 少用定时器;3. 优化I/O操作:尽量不要频繁写入小数据,最好批量一次性写入;读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问;数据量比较大的,建议使用数据库(比如SQLite、CoreData)。4. 网络优化:减少、压缩网络数据;如果多次请求的结果是相同的,尽量使用缓存;使用断点原创 2020-06-16 10:39:30 · 458 阅读 · 0 评论 -
iOS 离屏渲染
在OpenGL中,GPU有2种渲染方式On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作离屏渲染消耗性能的原因需要创建新的缓冲区;离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕。哪原创 2020-06-16 10:37:03 · 233 阅读 · 0 评论 -
iOS性能优化 - 卡顿优化
成像过程:在iOS中是双缓冲机制,有前帧缓存、后帧缓存成像原理:发出垂直同步信号,告诉屏幕即将显示一帧数据;发出水平同步信号,显示一行一行的数据,直到填充到整个屏幕为止。产生卡顿的原因如图:垂直同步信号的发射频率是固定的,信号发出,代表着即将显示数据;如果期间,CPU或GPU有一步耗时较长(第3帧的渲染),垂直信号已发出,但是GPU还没有渲染完,那么就是显示渲染好的第2帧数据,连续显示相同的帧,就造成了画面卡顿。第3帧会在第4次同步信号过来时再显示。所以解决卡顿的主要原创 2020-06-16 10:35:25 · 554 阅读 · 0 评论 -
iOS scrollView 左右滑动 内容错位
环境:UIScrollView承载多个controller,顶部有选择控制器的标题栏按钮;现象:频繁的切换点击标题栏按钮,或左右滑动控制器,导致临近两控制的内容发生重叠现象。1.添加两个布尔属性@property (nonatomic, strong) UIScrollView *contentView;@property (nonatomic, assign) BOOL allowBtnCilc原创 2017-05-19 17:45:56 · 1968 阅读 · 0 评论 -
iOS 获取手机剩余存储空间
两种方法均与哔哩哔哩剩余内存统计比较过,数据一样,且都小于iOS系统 <设置>里统计的数据;方法一:#include <sys/param.h>#include <sys/mount.h>+ (NSString *)freeDiskSpaceInBytes{ struct statfs buf; unsigned long long freeSpace = -1; if (原创 2017-05-23 17:56:17 · 6190 阅读 · 0 评论 -
iOS 扩展Ijkplayer解码方式
Ijkplayer框架中,解码方式的选择只有 智能硬解(硬解失败,自动转软解)、软解 两种,功能上讲,两种方式已够用,但偶尔也有需求让扩展成用户自选的三种解码方式:智能、硬解、软解。下文讲的就是如何在原框架中,扩展出 硬解 的选项,及其失败后对应的消息处理:1.在 ff_ffplay_options.h 文件下修改“videotoolbox”的最大值,范围由0 ~ 1,扩展到0 ~ 2:0:软解1原创 2017-05-19 17:42:58 · 3101 阅读 · 0 评论 -
iOS 飞屏功能的实现(UDPSocket协议广播机制)
飞屏,用手机播放电脑端视频的功能,一般常见于主打VR资源的影音类App。大体思路:基于UDP协议的广播机制电脑端不断发送udp广播,广播内容可精简为:端口号; App用udpSocket扫描,得到对应端口号信息,解析出IP地址,拼接数据,请求数据。移动端的实现:1.导入第三方库:CocoaAsyncSocket,引用文件#import <GCDAsyncUdpSocket.h>2.遵守协议:<GC原创 2017-05-19 09:15:13 · 1770 阅读 · 0 评论 -
iOS 判断UIScrollView是上拉还是下拉
以collectionView为例<UIScrollViewDelegate >@property (nonatomic, assign) NSInteger lastcontentOffset; //添加此属性的作用,根据差值,判断ScrollView是上滑还是下拉 self.collectionView.delegate = self;- (void)scrollViewDidScroll:(原创 2016-12-27 13:50:26 · 4530 阅读 · 0 评论 -
iOS 过滤下载资源类型
以视频下载为例:在做下载功能时,有时候会遇到后台给提供了非视频资源的下载链接, 如下方法可将非视频资源过滤掉#pragma mark - NSURLSessionDelegate- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSHTT原创 2016-12-27 13:48:52 · 381 阅读 · 0 评论 -
iOS 判断字符串是否含有表情
+ (BOOL)stringContrainsEmoji:(NSString *)string { __block BOOL returnValue = NO; [string enumerateSubstringsInRange:NSMakeRange(0, string.length) options:NSStringEnumerationByComposedCharacterS原创 2016-12-05 16:40:46 · 924 阅读 · 0 评论 -
iOS 常用的一些正则表达式
1.判断邮箱格式是否合法- (BOOL) isEmail { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailReg原创 2016-12-05 16:39:52 · 371 阅读 · 0 评论 -
iOS 将图片存到本地
将图片以Data形式存到本地,并返回路径- (NSString *)saveImg:(UIImage *)image withVideoMid:(NSString *)imgName{ if (!image) { //防止image不存在,存一个占位图 image = [UIImage imageNamed:@"posters_default_horizontal"];原创 2016-12-05 16:38:54 · 1671 阅读 · 1 评论 -
iOS 监听本地文件复制进度
做文件共享的时候,iTunes往app导入本地视频,实时监听文件的复制进度 NSInteger lastSize = 0; NSDictionary *fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:videoPath error:nil]; NSInteg原创 2016-12-05 16:36:33 · 1065 阅读 · 0 评论 -
iOS Runtime获取对象所有key值
1.引入库include <objc/runtime.h>2.以系统对象为例,正常情况下我们无法查看系统对象的私有属性,如下方法可以得到其全部属性。以相册的PHAsset为例:for (PHAsset *asset inself.assetsFetchResults) { unsigned int count; // 获取属性列表 objc_property_t *prope原创 2016-12-05 16:34:50 · 1262 阅读 · 0 评论 -
iOS iTunes导入本地视频(文件共享)
完成效果:用iTunes向app导入视频后,不用手动刷新,编写的工具类会实时监听复制状态,复制完成后会自动刷新UI.大坑:因为文件共享是共享的是Document文件夹,所以你需要把不共享的文件,如:数据库文件、缓存文件等,存放到“Preferences”或“Caches”文件夹下,否则app会被拒!!!1.在Info.plist添加字段:“Application supports iTunes fi原创 2016-12-02 09:10:33 · 6284 阅读 · 0 评论 -
iOS 获取视频缩略图
根据视频资源的路径获取视频的缩略图+(UIImage *)getThumbnailImage:(NSString *)videoPath { if (videoPath) { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath: videoPath] options:ni原创 2016-12-01 09:45:58 · 3235 阅读 · 0 评论 -
iOS 如何获取相册资源路径
获取方法如下:使用PhotoKit框架[[PHImageManager defaultManager] requestPlayerItemForVideo:videoAsset options:nil resultHandler:^(AVPlayerItem * _Nullable playerItem, NSDictionary * _Nullable info) {原创 2016-12-01 09:16:05 · 8641 阅读 · 0 评论 -
iOS网络编程:一 、GET方式同步请求
注:此方法需要修改配置info.plist 右键选择open AS —- Source code , 将 <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key> <true/></dict>拷贝到:打开文件后面最后一个:</array> 的下面 //1 生成URL NSURL *url原创 2016-01-04 21:29:04 · 388 阅读 · 0 评论 -
iOS Framework的创建
环境:Xcode 81.创建framework2.修改相关配置1)设定SDK适配的iOS系统版本号2)选择性添加: armv7s原因: armv6, armv7, armv7s是ARM CPU的不同指令集, armv6设备:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch; armv7设备:iPhone 3GS,iPhone 4,iPhone 4S,iP原创 2017-06-02 15:52:58 · 1791 阅读 · 0 评论 -
iOS XXXXX is not an object file (not allowed in a library)
以libsqlite3.tbd 为例1.将下图标注的路径复制下来2.根据路径找到相应的文件“commend + shift + G”进入文件夹 3.添加一遍后,将 .tbd 的文件删除掉,clean一下,重新编译就可以了。原创 2017-06-02 15:53:53 · 4961 阅读 · 1 评论 -
iOS SDK中使用了第三方框架问题
以在SDK中使用了FMDB为例在下图标识的路径中,将Compile Source 路径下关于FMDB的文件全部删除就可以了显示如下:原创 2017-06-02 15:54:31 · 1245 阅读 · 0 评论 -
XML解析:二、Dom解析
DOM解析 document object model(文档对象模型) 一次性全部读取 占内存,但对iOS影响很小,但对java影响很大 解析的时候,将文档整体的读入,并将XML结构化成树状,使用时,通过树枝来获取 DOM解析方式比较好的一个实现是Google提供的一个GData,是开源的,他是对libxml.dylib 的封装,也就是说需要导入类库,并且需要修改配置。 1、配置修改(以原创 2016-01-11 19:18:19 · 435 阅读 · 0 评论 -
iOS网络编程:六、PostBlock异步
- (void)PostBlockAsyncAction{ NSURL *url = [NSURL URLWithString:ZQPOSTURL]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; [request setHTTPMethod:@"POST"];原创 2016-01-06 22:27:34 · 420 阅读 · 0 评论 -
iOS网络编程:五、Post代理异步
@interface RootViewController ()<NSURLConnectionDataDelegate>@property (nonatomic, strong) NSMutableArray *data;@property (nonatomic, strong) NSMutableData *tempData;@end注:在Button的响应之下- (void)Postd原创 2016-01-06 22:23:07 · 387 阅读 · 0 评论 -
iOS网络编程:四、Block方式实现异步
//1创建URL NSURL *url = [NSURL URLWithString:CQGETUEL]; //2创建请求对象 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; //3 发送异步请求 --(异步请求不是多线程,因为都在 mainQueue 中,没原创 2016-01-06 22:16:44 · 597 阅读 · 0 评论 -
iOS网络编程:三、GET代理方式进行异步请求
@interface RootViewController ()<NSURLConnectionDataDelegate>@property (nonatomic, strong) NSMutableArray *data;@property (nonatomic, strong) NSMutableData *tempData;@end- (void)GetDelegateAction{原创 2016-01-06 22:14:24 · 638 阅读 · 0 评论 -
iOS网络编程:二、POST方式同步请求
//网络请求 //1.生成URL NSURL *url = [NSURL URLWithString:CQGETUEL]; //2.创建请求对象,绑定URL NSMutableURLRequest *requst = [[NSMutableURLRequest alloc] initWithURL:url]; //3.发送请求 NSData *data原创 2016-01-04 21:41:47 · 505 阅读 · 1 评论 -
iOS常用手势
iOS里面提供了7个手势 轻拍,平移,轻扫,缩放,旋转,长按,屏幕边界- (void)viewDidLoad { [super viewDidLoad]; //UIImageView 默认关闭用户响应 self.rv.imageView.userInteractionEnabled = YES;#pragma mark -- 轻拍手势 UITapGestureReco原创 2016-01-08 21:28:16 · 470 阅读 · 0 评论