
iOS沉思录
文章平均质量分 91
思考iOS中的细节与原理
Mr_厚厚
iOS平台,Unity3D,Metal2,图形学
展开
-
【iOS沉思录】Foundation对象与Core Foundation对象的区别转换和内存管理权移交
Foundation对象与Core Foundation对象的区别Foundation对象是Objective-C对象,使用Objective-C语言实现;而Core Foundation对象是C对象,使用C语言实现。两者之间可以通过__bridge、__bridge_transfer、__bridge_retained等关键字转换(桥接)。Foundation对象和Core Founda...原创 2018-04-05 18:56:50 · 1089 阅读 · 0 评论 -
【iOS沉思录】iOS中如何触发定时任务或延时任务?
iOS中如何触发定时任务或延时任务?定时任务指的是周期性的调用某个方法,实现任务的反复执行,例如倒计时功能的实现;延时任务指的是等待一定时间后再执行某个任务,例如页面的延时跳转等。iOS中控制任务的延时或定时执行的方法有很多,使用中要注意是同步还是异步,是否会阻塞主线程等问题。实现方法主要如下:1.performSelector实现延时任务延时任务可以通过当前UIViewContr原创 2018-02-02 20:57:38 · 6059 阅读 · 0 评论 -
【iOS沉思录】iOS沙盒内存使用深入剖析
背景沙盒存储是iOS数据持久化的一种方案,操作简单,可以将数据以NSData以及常用的NSDictionary和NSArray的组织方式(通过plist文件创建文件对象)在沙盒的Documents目录中读写更新以及删除。沙盒存储的缺点是更新比较低效,每次都要将数组或者字典读出,更新后再次写入。问题现在的问题是:开发者通过获取沙盒Documents路径往沙盒中写数据占用内存是无...原创 2018-03-12 17:41:59 · 1060 阅读 · 4 评论 -
【iOS沉思录】深剖Objective-C中的重载和重写
首先,Objective-C中不完全支持重载,网上很多人要么将重载和重写搞混,要么说OC不支持重载(当然按照重载严格定义说OC不支持重载也没错),事实上OC支持参数个数不同的函数重载。问:Objective-C和Swift中有重载吗?答:Swift中有重载,但Objective-C中基本不支持重载。展开:重载、重写和隐藏三者在编程语言中的定义重载(overload):函数名相同,函数的参数列表不同...原创 2016-10-26 22:35:53 · 2904 阅读 · 0 评论 -
【iOS沉思录】如何招聘一个靠谱的 iOS程序员+面试题详解
原文来源链接:http://blog.sunnyxx.com/2015/07/04/ios-interview/ 答案详解链接:https://github.com/ChenYilong/iOSInterviewQuestions 近一年内陆续面试了不少人了,从面试者到面试官的转变让我对 iOS 招聘有了更多的感受。经过了前段时间的一大波面试,我们终于找到了志同道合的小伙伴,面试也暂时告一段转载 2017-01-01 23:45:32 · 2858 阅读 · 1 评论 -
【iOS沉思录】如何创建NSTimer并使其在当前线程中正常运行?
NSTimer主要用于开启定时任务,但要真确使用才能保证其正常有效运行。尤其要注意以下两点:确保NSTimer已经添加到当前RunLoop;确保当前RunLoop已经启动。1.创建NSTimer有两种方法:+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(S原创 2018-02-01 10:30:30 · 1754 阅读 · 0 评论 -
【iOS沉思录】GCD实现线程同步的方法
在iOS多线程中我们知道NSOperationQueue操作队列可以直接使用addDependency函数设置操作之间的依赖关系实现线程同步,还可以使用setMaxConcurrentOperationCount函数直接设置最大并发数量。那么在GCD中又是如何实现线程同步和控制最大并发数量的呢?事实上在之前的问题中我们已经提到了GCD实现线程同步的两种方法了,一种是组队列(dispatch_gro原创 2017-06-02 22:31:40 · 4115 阅读 · 1 评论 -
【iOS沉思录】NSTimer你真的会用了吗
原文:http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html 看到这个标题,你可能会想NSTimer不就是计时器吗,谁不会用,不就是一个能够定时的完成任务的东西吗? 我想说你知道NSTimer会retain你添加调用方法的对象吗?你知道NSTimer是要加到runloop中才会起作用吗?你知道NSTimer转载 2017-06-04 22:14:38 · 1384 阅读 · 0 评论 -
【iOS沉思录】BAD_ACCESS内存错误调试
BAD_ACCESS 在什么情况下出现BAD_ACCESS 报错属于内存访问错误,会导致程序崩溃,错误的原因是访问了野指针(悬挂指针)。野指针指的是本来指针指向的对象已经释放了,但指向该对象的指针没有置 nil,指针指向随机的未知的内存,程序还以为该指针指向那个对象,导致存在一些潜在的危险访问操作,这些危险访问操作无法被指针指向的未知内存所处理,就会导致BAD_ACCESS错误造成程序崩溃。访问的含原创 2017-05-12 22:26:28 · 5251 阅读 · 1 评论 -
你真的理解__block修饰符的原理么?
开篇自测在本文的开头,提出两个简单的问题,如果你不能从根本上弄懂这两个问题,那么希望你阅读完本文后能有所收获。为什么block中不能修改普通变量的值?__block的作用就是让变量的值在block中可以修改么?如果有的读者认为,问题太简单了,而且你的答案是:因为编译器会有警告,各种教程也都说了不能修改。应该是的吧。那么我也建议你,抽出宝贵的几分钟时间阅读完本文吧。在开始揭开__block的神秘面纱转载 2017-05-23 17:40:20 · 1124 阅读 · 0 评论 -
【iOS沉思录】OC和Swift语言互调
OC和Swift之间的互调很简单,iOS8以后官方给出了这两种语言之间的桥接方案,简单说就是在Swift工程中,通过提示创建的Bridging头文件可以将OC文件和Swift文件衔接在一起,从而可以在OC文件中引用Swift类,或者在Swift文件中引用OC的类。应用较多的主要是在Swift中调用OC类,使得在最新的swift工程中仍然能够兼容使用以前的OC类库等。这里通过一个简单的例子展示在Sw原创 2017-04-12 14:35:21 · 1905 阅读 · 0 评论 -
【iOS沉思录】Objective-C语言消息传递机制三道防线:消息转发机制详解
消息传递机制:在OC中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用‘动态绑定’机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码。方法的调用实际就是告诉对象要干什么,给对象(的指针)传送一个消息,对象为接收者(receiver),调用的方法及其参数即消息(message),给一个对象传消息表达为:[receiver message]; 接受者的原创 2017-04-15 03:16:20 · 2019 阅读 · 0 评论 -
【iOS沉思录】UIImage圆角矩形的‘离屏渲染’和‘当前屏幕渲染’实现方法
iOS中为view添加圆角效果有两种方式,一种基于“离屏渲染”(off-screen-renderring),直接设置view的layer层参数即可简单实现,也很常用,但性能较低;另一种则是编写底层图形代码,实现‘在屏渲染’(on-screen-renderring),可以大大优化绘制性能。iOS中圆角效果实现的最简单、最直接的方式,是直接修改View的layer层参数:/* 设置圆角半径 */原创 2017-04-19 15:22:38 · 3480 阅读 · 0 评论 -
【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结
OC中的多线程OC中多线程根据封装程度可以分为三个层次:NSThread、GCD和NSOperation,另外由于OC兼容C语言,因此仍然可以使用C语言的POSIX接口来实现多线程,只需引入相应的头文件:#include <pthread.h>。NSThreadNSThread是封装程度最小最轻量级的,使用更灵活,但要手动管理线程的生命周期、线程同步和线程加锁等,开销较大;NSThread的基本使用原创 2017-04-04 12:34:49 · 6775 阅读 · 4 评论 -
【iOS沉思录】iOS内存管理试题总结与详解
iOS中的GC垃圾回收机制与内存管理机制问题: Objective-C有GC垃圾回收机制吗?GC(Garbage Collection),垃圾回收机制,简单地说就是程序中及时处理废弃不用了的内存对象的机制,防止内存中废弃对象堆积过多造成内存泄漏。Objective-C语言本身是支持垃圾回收机制的,但有平台局限性,仅限于Mac桌面系统开发中,而在iPhone和iPad等苹果移动终端设备中是不支持垃原创 2017-03-09 13:57:20 · 6639 阅读 · 0 评论 -
【Demo】iOS平台上的讯飞语音识别语音合成开发
官方文档:http://www.xfyun.cn/doccenter/iOS目前开放的服务: 准备工作需要到讯飞官网注册一个开发账号,注册后登录并创建一个新的应用,添加需要的服务(语音听写、语音合成等等),应用创建后可以得到一个Appid,这个要在开发中初始化讯飞语音应用中用到。 工程中找到Targets->Build Phases->Link Binary With Libraries,添原创 2017-03-04 17:36:46 · 3147 阅读 · 0 评论 -
【iOS沉思录】Objective-C运行时特性:Method Swizzling魔法
OC运行时特性,为我们提供了一个叫做Method Swizzling的方法魔法利器,利用它我们可以更加随心所欲的在运行时期间对编译器已经的方法再次动手脚,主要包括:交换类中某两个方法的实现、重新添加或替换某个方法的具体实现。运行时的几种特殊类型Class: 类名,通过类的class类方法获得,例如:[UIViewController class];SEL:选择器,也就是方法名,通过@selec原创 2017-03-06 19:22:42 · 1131 阅读 · 0 评论 -
【iOS沉思录】iOS子线程更新UI到主线程的三种方法
以下代码有什么问题?如何修复?@interface TTWaitController : UIViewController@property (strong, nonatomic) UILabel *alert;@end@implementation TTWaitController- (void)viewDidLoad{ CGRect frame = CGRectMake(20, 200原创 2017-02-08 22:03:53 · 26742 阅读 · 0 评论 -
【iOS沉思录】SDWebImage图片二级缓存异步加载基本原理
关于SDWebImageSDWebImage是一个针对图片加载的插件库,提供了一个支持缓存的用于异步加载图片的下载工具,特别的为常用的UI元素:UIImageView,UIButton和MKAnnotationView提供了Category类别扩展,可以作为一个很方便的工具。其中SDWebImagePrefetcher可以预先下载图片,方便后续使用.SDWebImage的Github地址为:htt原创 2017-01-24 15:09:45 · 6423 阅读 · 4 评论 -
【iOS沉思录】UITableView的重用机制与加载优化详解
UITableView可以说是UIKit中最重要的一个组件,用来展示数据列表,还可以灵活使用进行页面的布局。UITableView的使用遵循MVC模式,数据模型(NSObject)、视图(UIView)和控制器(UITableViewController)分离。UITableView继承自UIScrollView,可上下滑动,可以作为跟视图也可以作为子视图组件。 UITableViewContr原创 2017-02-08 16:44:28 · 4249 阅读 · 0 评论 -
【iOS沉思录】KVC与KVO,NSNotification通知
什么是键值编码KVC,键路径是什么? 什么是键值观察KVO?键值编码KVC: 键值编码是一种在NSKeyValueCoding非正式协议下使用字符串标志间接访问对象属性的一种机制,也就是访问对象变量的一种特殊的捷径。如果一个对象符合键值编码的约定,那么它的属性就可以通过一个准确的、唯一的字符串(键路径字符串)参数进行访问,类似于将所有对象看做字典Dictionary,键路径为key(实际为key原创 2017-01-21 23:08:23 · 1562 阅读 · 0 评论 -
【iOS沉思录】OC中的类扩展机制:Category类别和Extension类扩展
OC中类别(Category)是什么?Category类别是Objective-C语言中提供的一个灵活的类扩展机制。类别用于在不获悉、不改变原来代码的情况下往一个已经存在的类中添加新的方法,只需要知道这个类的公开接口,而不需要知道类的源代码。类别只能为已存在的类添加新的方法,而不能添加实例变量。类别扩展的新方法有更高的优先级,会覆盖同名的原类的已有方法。 Category类别与其他特性的比较?原创 2017-01-19 23:38:05 · 5493 阅读 · 1 评论 -
【iOS沉思录】iOS中的二维数组
首先我们知道OC中是没有二维数组的,二维数组是通过一位数组的嵌套实现的,但是别忘了我们有字面量,实际上可以和C/C++类似的简洁地创建和使用二维数组。这里总结了创建二维数组的两种方法以及数组的访问方式。 通过字面量创建和使用二维数组(推荐) // 1.字面量创建二维数组并访问(推荐) NSArray *array2d = @[ @原创 2017-01-05 22:14:15 · 9903 阅读 · 0 评论 -
【iOS沉思录】iOS添加自定义字体详解
字体是软件开发中个性化的一个重要元素,系统自带了很多丰富的字体,但有时候并不能满足个性化的需求,这时候可以向工程中添加自定义的系统字体,然后就可以像使用系统字体一样使用。字体文件最常用的为ttf等格式。导入自定义字体过程很简单:添加资源包到工程->在info.plist文件中注册字体->在工程Bundle Resource中复制字体资源包->代码检测查询加入的字体并使用 添加资源包addFi原创 2017-01-04 17:50:10 · 3174 阅读 · 0 评论 -
【iOS沉思录】:iOS多媒体音频(下)-录音及其播放
上一篇中总结了iOS中音效和音频播放的最基本使用方法,其中音频的播放控制是使用AVFoundation.framework框架中的AVAudioPlayer播放器对象来实现的,而这里音频的录制则是使用了同样框架下的一个叫AVAudioRecorder的录音机对象来实现,这两个类的用法流程非常类似,类的属性和方法也类似,例如:播放器中需要获取音频文件的url,而录音机要在沙盒中Docuemnt目录下创原创 2016-12-29 23:28:18 · 3967 阅读 · 0 评论 -
【iOS沉思录】Objective-C语言的动态性总结(编译时与运行时)
编译时与运行时编译时: 即编译器对语言的编译阶段,编译时只是对语言进行最基本的检查报错,包括词法分析、语法分析等等,将程序代码翻译成计算机能够识别的语言(例如汇编等),编译通过并不意味着程序就可以成功运行。运行时: 即程序通过了编译这一关之后编译好的代码被装载到内存中跑起来的阶段,这个时候会具体对类型进行检查,而不仅仅是对代码的简单扫描分析,此时若出错程序会崩溃。可以说编译时是一个静态的阶段,类型原创 2016-12-25 23:26:52 · 8682 阅读 · 4 评论 -
【iOS沉思录】:iOS多媒体音频(上)-音频播放
在移动应用中,我们通常将声音的播放分成两类:一种是一次性播放的简单音效(包括手机振动),音效通常很短暂,只要实现让其播放即可,播放完成即结束;另一种指的是可精确控制的音乐播放,可以控制音乐播放,暂停,继续播放,音量控制,循环播放等等。在IOS中这两种声音播放分别通过AudioToolbox.framework和AVFoundation.framework框架来实现,前者是系统音效播放,后者是AVAu原创 2016-12-23 18:50:19 · 1670 阅读 · 0 评论 -
【Demo】IOS中将对象数组按照时间戳排序
将对象按照时间戳排序,这里典型的一个例子是登录账户的排序:本地客户端可能保存了多个账户信息,在登录窗口用户可以选择已经登陆过的账户直接登录,现在的需求是要时刻让最近登陆过的账户排在前面,对于每个账户,每次登陆时都记录下当前登陆的时间,时间是一个时间戳(从1970年到现在的秒数)。我们要做的是将时间戳排序,然后按照时间戳的顺序将所有账户排序。当然这也适用于其他关于时间排序的问题。 实现思路和过程1.原创 2016-12-22 18:37:28 · 8250 阅读 · 0 评论 -
【最新iOS获取设备信息】:UIDevice,NSBundle,NSLocale
IOS开发中获取设备的信息指的是像设备号、应用名称以及国家语言等非用户隐私信息,这些信息多数我们都可以在开发时在Xcode工程中就可以看到,同时我们可以利用提供的UIDevice,NSBundle,NSLocale三个类来获取一些我们开发中常用到的信息。 UIDeviceUIDevice可以帮我们获取移动设备的基本信息:设备名称、设备模式、系统名称、系统版本、设备唯一标识符以及设备方向等等。其中原创 2016-12-21 20:50:30 · 1491 阅读 · 0 评论 -
【IOS沉思录】开发软硬件SDK支持以及Swift语言
iPhone和iPad软件支持iOS2007年发布2008年发布开发者SDKiOS当前的版本为:10.2官方开发者论坛:Apple Developer Forums官方开发者教程文档资源库:Resources硬件支持A10处理器(iPhone7/7+)A9处理器(iPhone6s/6s+)A8处理器(iPhone6/iPhone6+)A8X处理器(iPad Air2)A7处理原创 2016-12-17 18:38:47 · 1542 阅读 · 0 评论 -
【iOS沉思录】深思Objective-C中的property属性
OC中的属性属性(Property)是Objective-C语言的其中一个特性,它把类对象中的数据变量及其读写方法统一封装起来,是对传统C++中反复定义变量读写方法的一种封装优化,OC将这些变量封装为实例变量,系统可自动生成getter和setter读写方法,同时仍然允许开发者利用@property、@synthesize和@dynamic关键词去选择性自定义读写方法的方法名或者方法实现。 回原创 2016-11-22 19:21:41 · 4837 阅读 · 4 评论 -
【IOS沉思录】UIView和CALayer以及UIWindow的区别与联系
先看UIView和CALayer是什么苹果官方对这两个类的介绍:UIView CALayer首先CALayer(层)是一个比UIView更底层的图形类,是对底层图形API(OpenGL ES)一层层封装后得到的一个类,用于展示一些可见的图形元素,保留了一些基本的图形化的操作,但同时由于相对高度的封装,使得操作使用变得很简单。CALayer用于管理图形元素,甚至可以制作动画,他保留了一些几何属性,例如原创 2016-11-11 11:27:01 · 3423 阅读 · 0 评论 -
【IOS沉思录】IOS中的协议Protocol与代理Delegate
Protocol和Delegate简介Protocol协议类似于Java中的接口,是一个自定义方法的集合,让遵守这个协议的类去是实现为了达到某种功能的这些方法,与Java接口不同的是协议中可以定义可选择实现的方法。Delegate代理是一种设计模式,是一个概念,只不过在Objective-C中通过Protocol来进行实现,指的是让其他类来通过本类中定义的协议代理方法‘远程’帮助实现一些操作,完成一原创 2016-11-11 12:09:50 · 2919 阅读 · 0 评论 -
【Demo】UITableView实现分组可折叠下拉列表
前言UITableView作为UIKit中最重要的一个组件,应用还是很广泛很灵活的,它的特性用来实现分组列表再合适不过。可折叠分组列表最典型的是好友列表,是一个二级目录,点击每一个分组都会展开或折叠一个好友列表。这里使用TableView的section header作为分组一级目录,每个section的cell作为二级目录。section header里面放的是一个自定义的UIButton,but原创 2016-11-05 18:41:23 · 2943 阅读 · 0 评论 -
【IOS沉思录】Objective-C中的糖衣语法(字面量)
糖衣语法的定义糖衣语法,又叫‘语法糖’、‘语法盐’等等,是由英国计算机科学家彼得·约翰·兰达(Peter J.Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。糖衣语法在各种语言中都又出现,最常用的就是数组的[ ]操作符的下标访问以及{ }操作符对数组的初始化,例如C语原创 2016-11-03 15:36:24 · 2112 阅读 · 0 评论 -
【iOS沉思录】Objective-C中的多态性分析
首先,Objective-C中不完全支持重载,网上很多人要么将重载和重写搞混,要么说OC不支持重载(当然按照重载严格定义说OC不支持重载也没错),事实上OC支持参数个数不同的函数重载。面试官:Objective-C和Swift中有重载吗?答:Swift中有重载,但Objective-C中基本不支持重载。展开:重载、重写和隐藏三者在编程语言中的定义重载(overload):函数名相同,函数的参数列表不原创 2016-10-26 22:37:44 · 4877 阅读 · 0 评论 -
【Demo】UIKit重写UIButton自定义复选框UICheckBox
UIKit框架中没有checkbox复选框的组件,但是UIButton组件有UIControlStateNormal和UIControlStateSelected两个状态,并且有selected属性纪录按钮是否被选中,因此可以利用按钮组件很简单实现复选框的组件。这里为了使用方便,以复选框的坐标位置为参数直接初始化使用一个复选框,复选框的size在类中宏定义,同时注册按钮点击事件每次点击取反按钮原创 2015-09-24 17:17:47 · 1617 阅读 · 0 评论 -
IOS游戏开发之cocos2d-x实现自定义字体
游戏中需要使用一些自定义的字体,比如将从网上下的TTF字体包嵌入工程中,具体实现如下:1.首先将字体包导入工程,字体名称可以根据需要改:2.然后在info.plist文件中添加自定义字体,先添加Information Property List的Fontsprovided byapplication项,在添加字体item项,item项中添加字体包的名称,item字体项的名称一定要和资源原创 2016-03-11 09:18:48 · 1125 阅读 · 0 评论 -
Xcode工程调试报错问题整理
遇到个奇怪的问题,将工程转移到另一个电脑上的xcode中突然无法选择模拟器,原因是xcode版本不一样的问题,只要到工程info中根据版本设置一下对应的DeploymentTarget版本就好了。原创 2016-03-11 09:47:34 · 1740 阅读 · 1 评论 -
Xcode-工程添加预编译头文件Prefix.pch
在项目中预编译头文件用来把频繁使用的常量或者框架文件引入到每一个项目类文件中,加入的方法是新建PCH文件,并在工程中添加PCH文件的路径即可:新建PCH文件:在工程Build Setting中找到Apple LLVM 6-Language,在里面的PrefixHeader中加入pch文件的绝对路径。原创 2016-03-11 09:47:39 · 2559 阅读 · 0 评论