iOS
文章平均质量分 71
zfpp25_
iOS
展开
-
iOS开发~WKWebView白屏适配
WKWebView虽好,但白屏问题也很苦恼,下面分享一下自己解决问题的过程。公司项目使用Cordova框架,做原生项目嵌入H5,业务复杂了以后,H5资源也越来越大,占用内存越来越多,加载也越来越慢,直到做热更新时候,遇到了白屏问题。第一步:有说白屏时候回调webViewWebContentProcessDidTerminate方法,那就加上吧:- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView { [w..原创 2021-11-03 12:17:17 · 4452 阅读 · 0 评论 -
SpriteKit从零开始~Visual and Audio Effects
介绍在本教程(从零开始)中的SpriteKit系列的第四部分中,我们将看一下SpriteKit提供的各种视觉和音频功能,这些功能可以为您的游戏添加更多细节和多样性。这包括粒子系统,滤镜,灯光和音频。为了跟上我,您可以使用本系列上一教程中创建的项目,也可以在GitHub上下载新副本。本系列中用于游戏的图像可以在GraphicRiver上找到。GraphicRiver是查找游戏插图和图像的理想资源。1.粒子系统在SpriteKit中,术语“粒子系统”是指由类SKEmitterNo...翻译 2021-02-21 18:05:24 · 295 阅读 · 0 评论 -
SpriteKit从零开始~Physics and Collisions
介绍在本教程中,这是SpriteKit从头开始的系列的第三部分,我们将详细介绍SpriteKit的物理模拟功能以及如何在2D游戏中使用它。翻译 2021-02-19 14:53:26 · 437 阅读 · 0 评论 -
SpriteKit从零开始~Constraints and Actions
介绍继上一篇SpriteKit基础,这一篇将学习constraints和actions。这些功能用于在SpriteKit中为游戏添加动作和动画,同时限制游戏中节点的位置和方向。您可以使用在本系列的第一个教程中创建的项目,或者在GitHub上下载新副本。1.自定义Node和Scene在向Scene中添加constraints和actions之前,我们首先需要创建一些类,以便我们代码中可以使用Node。根据iOS> Source> Cocoa Touch Class模板创建一个新类P翻译 2021-02-09 18:17:56 · 378 阅读 · 0 评论 -
SpriteKit从零开始~基础
介绍SpriteKit可在iOS,tvOS和OS X上使用,它是一个框架,使开发人员可以创建高质量的2D游戏,而不必担心OpenGL和Metal等图形API的复杂性。除了为开发人员处理所有图形外,SpriteKit还提供了广泛的高级功能,包括物理模拟,音频/视频播放以及游戏保存/加载。在整个系列中,您将学习有关SpriteKit的所有知识,并开发技巧,然后将其应用于使用此出色框架创建的任何2D游戏中。在本系列中,我们正在创建一个多功能游戏,玩家可以在其中控制汽车,该汽车必须避免路上的障碍。..翻译 2021-02-07 11:27:51 · 992 阅读 · 0 评论 -
iOS开发~清理UIWebView
苹果2020年4月拒绝还在使用UIWebView的App提交,为此要全面清除存在的UIWebView代码。1、首先检索自己代码,把UIWebView相关的代码和注释都要删掉。2、排查哪些三方库使用了UIWebView或者文案涉及到了。打开终端,cd到项目根目录。执行以下命令,就能看到哪些文件内还在有UIWebview的踪迹。 grep -r UIWebView .等查询结果出来,就可以查看到哪些库用到了webView,哪些脚本中有相关代码,删除代码,更新库引用,完美解决...原创 2020-09-27 16:13:25 · 651 阅读 · 0 评论 -
iOS开发~Block学习总结
1、block的内部实现,结构体是什么样的?block的结构体如下:struct Block_literal_1 { void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor_1 {原创 2020-09-18 08:02:12 · 305 阅读 · 1 评论 -
iOS开发~Runloop学习总结
1、app如何接收到触摸事件的?首先,手机中处理触摸事件的是硬件系统进程 ,当硬件系统进程识别到触摸事件后,会将这个事件进行封装,并通过machPort,将封装的事件发送给当前活跃的APP进程。 由于APP的主线程中runloop注册了这个machPort端口,就是用于接收处理这个事件的,所以这里APP收到这个消息后,开始寻找响应链。 寻找到响应链后,开始分发事件,它会优先发送给手势集合,来过滤这个事件,一旦手势集合中其中一个手势识别了这个事件,那么这个事件将不会发送给响应链对象。 手势没有识别到原创 2020-09-18 07:38:11 · 560 阅读 · 0 评论 -
iOS开发~KVO学习总结
1、实现原理。在给对象A的属性name添加KVO观察者的时候,runtime会动态创建一个类B,这个类B继承自类A,并且重写了父类的属性name的setter方法,在重写的方法中,在给name成员变量赋值的前后,分别通知调用观察者回调。参考这篇文章2、如何手动关闭kvo?重写被观察对象的automaticallyNotifiesObserversForKey方法,返回NO 重写automaticallyNotifiesObserversOf<key>,返回NO注意:关闭k..原创 2020-09-18 07:37:42 · 486 阅读 · 0 评论 -
iOS开发~NSNotification相关总结
相关参考1、实现原理(结构设计、通知如何存储的、name&observer&SEL之间的关系等)参考这篇文章2、通知的发送是同步的,还是异步的?同步的3、NSNotificationCenter接收消息和发送消息是在一个线程里吗?如何异步发送消息?通知的接收和发送是在一个线程里实际上发送通知都是同步的,不存在异步操作。而所谓的异步发送,也就是延迟发送,在合适的实际发送。实现异步发送:让通知的执行方法异步执行即可 通过NSNotificationQu.原创 2020-09-18 06:30:16 · 538 阅读 · 0 评论 -
iOS开发~内存管理总结
1、weak的实现原理?SideTable的结构是什么样的weak:其实是一个hash表结构,其中的key是所指对象的地址,value是weak的指针数组,weak表示的是弱引用,不会对对象引用计数+1,当引用的对象被释放的时候,其值被自动设置为nil,一般用于解决循环引用的。weak的实现原理1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数原创 2020-09-17 16:33:53 · 426 阅读 · 0 评论 -
iOS开发~Runtime学习总结
1、Runtime的内存模型(isa、对象、类、metaclass、结构体的存储信息等)对象:OC中的对象指向的是一个objc_object指针类型,typedef struct objc_object *id;从它的结构体中可以看出,它包括一个isa指针,指向的是这个对象的类对象,一个对象实例就是通过这个isa找到它自己的Class,而这个Class中存储的就是这个实例的方法列表、属性列表、成员变量列表等相关信息的。/// Represents an instance of a class.s原创 2020-09-17 15:45:44 · 454 阅读 · 0 评论 -
iOS开发~App瘦身
概要App 的包大小做优化的目的就是为了节省用户流量,提高用户的下载速度,也是为了用户手机节省更多的空间。另外 App Store 官方规定 App 安装包如果超过 150MB,那么不可以使 OTA(over-the-air)环境下载,也就是只可以在 WiFi 环境下载,企业或者独立开发者万万不想看到这一点。免得失去大量的用户。同时如果你的 App 需要适配 iOS7、iOS8 那么官方规定主二进制 text 段的大小不能超过 60MB。如果不能满足这个标准,则无法上架 App Store。另一原创 2020-09-11 23:35:21 · 1089 阅读 · 0 评论 -
iOS开发~内存优化
一、为什么需要内存优化当我们开发iOS应用时,好的性能对我们的App来说是很重要的。你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核。 然而,由于ios设备的限制有时很难工作得很正确。我们开发时有很多需要我们记住这些容易忘记的决定对性能的影响。 这是为什么我写这篇文章的原因。这篇文章用备忘录的形式集合了28个技巧和诀窍可以用来提高你的app性能。所以保持阅读来给你未来的App一个很不错的提高。二、内存优化技巧以下这些技巧分为三个不同那个...原创 2020-09-11 15:08:56 · 808 阅读 · 0 评论 -
iOS开发~Crash优化
一、概要iOS App开发中和上线后,都会遇到程序异常退出的情况,导致崩溃的原因有很多,如果是在调试的过程中,可以通过设施断点或者打印关键信息的方式来进行调试,如果对于一些复杂模块非必现的异常崩溃,这种方式有时难以定位问题,而且对于已经发布上线的应用,这种方式更是无能为力。下面详细讨论崩溃产生的原因以及如何处理。二、Crash的捕获1、Crash产生原因1、应用中有Bug。 2、Watchdog 超时机制 3、用户强制退出 4、低内存终止 5、其他违反系统规则的操作,大部分是内存问题 .原创 2020-09-11 14:31:46 · 628 阅读 · 0 评论 -
iOS开发~卡顿优化
应用卡顿是让人头疼的问题,不像闪退一样直观明了,可以直接通过异常信号或调用栈分析得到,常常让人无处下手。好的用户体验需要我们把细节做到位,画面掉帧会导致卡顿感,造成不好的印象。卡顿是如何造成的,下面详细讲述。认识卡顿一些概念FPS:Frames Per Second,表示每秒渲染的帧数,通过用于衡量画面的流畅度,数值越高则表示画面越流畅。 CPU:负责对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics)。 GPU: 负责原创 2020-09-10 16:00:11 · 1213 阅读 · 0 评论 -
iOS开发~耗电量优化
一、概要耗电量分析是衡量应用性能表现的一个重要指标,要做好一款app,不仅仅是实现功能,我们需要考虑很多性能指标,让用户用的更爽,在开发过程中,要充分考虑到各项性能指标,比如定位精度,更高的精度,往往意味着更高的能耗,因此要平衡好精度和功耗,避免我们的app过多的过多的电量消耗,而界面卡顿可能意味着大量的多余计算,不仅影响流畅度,影响电量消耗,网络的不合理使用,也会增加耗电量,这些都是影响耗电量和用户体验的重要因素。用户可以在设置-电量查看过去24小时及七天,自己 app 耗电情况排行榜。如果你的.原创 2020-09-10 11:52:27 · 2614 阅读 · 0 评论 -
iOS开发~Time Profiler使用
Time Profiler时间分析工具,能帮助我们分析代码的执行时间,找出导致程序变慢的原因下面就用三个方法来进行相关测试://NSLog-(void)printLogOC{ //代码方式获取运行时间 double dateStart = CFAbsoluteTimeGetCurrent(); for (int i = 0; i<10000; i++) { NSLog(@"---->NSLOG:%d",i); } doubl原创 2020-09-09 16:39:19 · 1160 阅读 · 0 评论 -
iOS开发~App启动时间优化
概要App启动时长是其性能的重要指标之一,直接影响着用户对App的第一印象。随着版本迭代,产品形态不断完善,业务功能日趋复杂,项目也从一个独立业务App逐渐演变成一个多模块项目,甚至成为一个平台型App,可能同时承载多个业务模块,因此,更多更复杂的工作需要在App启动的时候被完成,由此可见,启动速度的优化必然就是 App 开发过程中,不可或缺的一个环节。一般情况下,App 的启动分为冷启动和热启动。冷启动:App 不在系统进程中,比如设备重启后,或是手动杀死 App 进程,又或是 App 长时间原创 2020-09-09 14:01:59 · 691 阅读 · 0 评论 -
Swift 中的 as,as?,as! 的区别
在我的认知中,如果as能成功的话,说明as?和as!也一定会成功。在大多数情况下这是对的,但凡是总有例外。看到下面的代码,不知道你能不能看出问题。print(4 as Double) // print 4.0print(4 as! Double) // crash第一行代码成功执行,但第二行代码会有编译器⚠️,而且会造成崩溃,这是为什么呢?造成这种情况的原因就是 as 和 as? 与 as! 的执行机制不同。as 是在编译期执行的,而 as? 和 as! 是在运行时执行的。在...原创 2020-09-08 06:48:46 · 520 阅读 · 0 评论 -
Swift快速入门
一、常量&变量在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量1、使用 let 定义常量,定义之后不可以修改let number = 10// 常量不可以修改number = 20 ❌2、使用 var 定义变量,定义之后可以修改var number = 10number = 20 ⚠️编译器会根据给变量或常量所赋的值,推断它的数据类型。所以这里系统会认为number是Int类型的⚠️ swift中输出语句:print函数pri原创 2020-09-07 21:51:37 · 2441 阅读 · 1 评论 -
Swift-27个知识点
1、柯里化(Currying)Swift 里可以将方法进行柯里化 (Currying),也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果的新方法func add(_ v1:Int,_ v2:Int) -> Int { return v1 + v2}print(add(1, 2))//柯里化(Currying)func add(_ v:Int) -> (Int) -> Int { return {$0 + v}}原创 2020-09-06 14:47:27 · 771 阅读 · 0 评论 -
OC到Swift的转变
1、Selector@selector是Objective-C时代的一个关键字,它可以将一个方法转换并赋值给一个SEL类型,它的表现很类似一个动态的函数指针。在 Objective-C 时selector非常常用,从设定target-action,到自举询问是否响应某个方法,再到指定接受通知时需要调用的方法等等,都是由selector来负责的。在 Objective-C 里生成一个selector的方法一般是这个样子的-(void) callMe { //...}-(voi...原创 2020-09-04 23:17:29 · 901 阅读 · 0 评论 -
OC项目转Swift总结
运行环境:Xcode 11.1 Swift5.0最近项目需要从Objective-C(以下简称OC)转到Swift,期间遇到一些问题,记录下来方便以后查阅。OC转Swift有一个大前提就是你要对Swift有一定的了解,熟悉Swift语法,最好是完整看过一遍官方的Language Guide。转换的过程分自动化和手动转译,鉴于自动化工具的识别率不能让人满意,大部分情况都是需要手动转换的。自动化工具有一个比较好的自动化工具Swiftify,可以将OC文件甚至OC工程整个转成Swift,号称准原创 2020-09-04 11:58:39 · 808 阅读 · 0 评论 -
swift学习总结
1.Class 和 Struct 的区别 类是引用类型, 结构体为值类型 结构体不可以继承 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝 引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝 2.理解Swift值类型的写时复制 只有当一个结构体发生了写入行为时才会有复制行为。 在结构体内部用一个引用类型来存储实际的数据,在不进行写入操作的普通传递过程中,都是将内部的r原创 2020-09-03 20:10:07 · 404 阅读 · 0 评论 -
iOS开发~细聊设计模式
文章目录一、概述二、框架模式,框架,设计模式1.首先搞清楚这三个概念:总结一、概述无论是初出茅庐还是代码老手,平时工作或面试的时候,经常会提到“设计模式”这个词,还记得刚接触iOS还不算入门的时候,第一次给领导汇报工作进度,就把MVC设计模式写在报告里,瞬间感觉自己写的东西好像专业一些了!后来接触项目越来越多,MVC更是耳熟能详,但随着学习积累,突然发现以前学东西不够系统和全面。那么问题第一个问题来了,MVC是不是设计模式?面试中也经常会问,例如:你经...原创 2020-08-31 13:43:18 · 702 阅读 · 0 评论 -
iOS多线程之线程锁
在多线程开发中,不可忽视的一个问题就是多个线程同时访问同一个资源时,会造成脏数据等预想不到的结果,为了避免这种现象,我们需要在访问资源的时候添加线程锁,来控制访问。添加线程锁的方式在这主要讲三种方式:@synchronized隐式创建锁对象 NSLock GCD的dispatch_semaphore_t信号机制一、@synchronized( )@synchronized()内的对象设定为锁的唯一标识,只有标识相同时,才满足互斥-(void)testSynchronized.原创 2020-08-28 17:10:23 · 242 阅读 · 0 评论 -
iOS音视频~编码理论详述
一、为什么要进行视频编码未经压缩的视频的数据量巨大,录制一分钟视频, 需要多大的空间来保存了?1> 为了不让用户感受到卡顿效果, 1秒钟之内至少需要16帧画面(正常开发通常会采集30帧),也就是编码设置的fps参数2> 假如该视频是一个1280*720分辨率的视频(正常情况下会比这个大很多)结果:128072016*60≈843.75M一分钟的视频843M,如果保证播放不卡顿,则需要15M/S 的下载速度,如果使用蜂窝网络...结论:1.如此大的传输数据量,现行带宽压力巨原创 2020-08-26 14:52:53 · 578 阅读 · 0 评论 -
iOS音视频~H264视频硬件编解码说明
一般系统都会提供GPU或者专用处理器来对视频流进行编解码,也就是硬件编码和解码,简称为硬编解码。苹果在iOS 8.0系统之前,没有开放系统的硬件编码解码功能,不过Mac OS系统一直有,被称为Video ToolBox的框架来处理硬件的编码和解码,终于在iOS 8.0后,苹果将该框架引入iOS系统。由此,开发者便可以在iOS里面,调用Video Toolbox框架提供的接口,来对视频进行硬件编解码的工作,为VOIP视频通话,视频流播放等应用的视频编解码提供了便利。(PS:按照苹果WWDC2014 5原创 2020-08-26 13:11:41 · 1218 阅读 · 0 评论 -
iOS开发~音视频编码
iOS音视频开发涉及的方面比较广泛,一般分为采集、音视频的封装、编码、推流、拉流、解封装、解码、播放等阶段。其中音视频的编码和解码阶段是非常重要的步骤。其中编码分为硬编码和软编码,对应解码分为硬解码和软解码。硬编码硬编码是指使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等。硬编码一般性能高,对CPU没有压力,但是对其他硬件要求较高(如GPU等)。软编码软编码是指使用CPU进行编码,软编码通常使用:ffmpeg+x264。软编码实现直接、简单,参数调整方便,升级易原创 2020-08-26 09:30:57 · 504 阅读 · 0 评论 -
有赞移动 iOS 组件化(模块化)架构设计实践
一、背景业务组件化(或者叫模块化)作为移动端应用架构的主流方式之一,近年来一直是业界积极探索和实践的方向。有赞移动团队自16年起也在不断尝试各种组件化方案,在有赞微信商城,有赞零售,有赞美业等多个应用中进行了实践。我们踩过一些坑,也收获了很多宝贵的经验,并沉淀出 iOS 相关框架Bifrost(雷神里的彩虹桥)。在过程中我们深刻体会到“没有绝对正确的架构,只有最合适的架构”这句话的意义。很多通用方案只是组件化的冰山一角,实际落地过程中还有相当多的东西需要考量。本文并不准备对组件化架构设计方案给出一..转载 2020-08-26 09:33:18 · 1081 阅读 · 1 评论 -
iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用
1.0 iOS模块化中的问题前文已经介绍了模块化的流程及一些常见的问题,我们在这里再次总结一下。在工作中,当我们开始一个新项目的时候,最先考虑的就是模块化工作。模块化工作的想法是很美好的,可是执行过程中会遇到很多的问题,而这些问题可能会让我们在工作中举步维艰。 工具使用问题。iOS的模块化一般会使用cocoapods工具,这个工具很强大,内容也很丰富,我们想要完成模块化工作,需要建立私有库,编写podspec文件,处理资源,编写Podfile文件,建立本地依赖等等。让团队成员每个人都精通这原创 2020-08-25 14:01:01 · 169 阅读 · 0 评论 -
iOS应用模块化的思考及落地方案(一)模块的划分及模块化工作流程
1.0 什么是模块化很多关于重构及设计模式的介绍中,经常提到的几个词语是复用及解耦。模块化之所以被提出,也更多是为了解决这几个问题。复用可以减少重复造轮子的情况,很容易理解的是,我们经常使用的github上的第三方框架,比如,AFNetworking等,有了这些组件,我们就不需要再写一遍了。解耦可以减少类或文件之间的关联,如果一个类引用了其他10个类,那么当我们看到这个类或修改这个类的时候,我们同时需要关注另外10个类,了解它们与本类的关联情况。如果你的类,没有与其他任何类关联,你在阅读代码原创 2020-08-25 14:00:30 · 425 阅读 · 0 评论 -
iOS视频开发(四):通俗理解YUV数据
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》前面我们已经介绍了在iOS开发中如果调用摄像头进行视频数据的采集和编解码。但折腾了这么多,对于YUV这玩意儿还是不是特别理解。其实在我的个人实践过程中我也一直搞不懂这个YUV,一顿恶补之后,我们来通俗一点地讲YUV这个数据格式。1、YUV & RGB概述2、YUV的采样方式3、YUV的储存方式及常见格式4原创 2020-08-25 13:36:38 · 830 阅读 · 0 评论 -
iOS视频开发(三):视频H264硬解码
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》上一篇《iOS视频开发(二):视频H264硬编码》我们已经学会了如何对视频数据进行H264编码并且了解了H264码流的基本结构。通常我们将视频进行H264编码是为了进行网络传输,如网络直播、视频会议等应用。网络传输相关的知识点较多且杂,这里我们且先不进行深入研究。我们接着讲对于H264数据,我们如何对其进行解码,本文就来讲原创 2020-08-25 13:35:57 · 973 阅读 · 0 评论 -
iOS视频开发(二):视频H264硬编码
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》上一篇《iOS视频开发(一):视频采集》我们已经介绍了如何采集iOS摄像头的视频数据,采集到的原始视频数据量是比较大的,这么大的数据量不利于进行储存或网络传输。于是我们需要对视频数据进行压缩,就像你要向别人传文件时觉得文件太大了,打个rar压缩包再发给对方的道理一样。视频数据的压缩也叫做编码,H264是一种视频编码格式,i原创 2020-08-25 13:35:11 · 2104 阅读 · 1 评论 -
iOS视频开发(一):视频采集
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》作为iOS音视频开发之视频开发的第一篇,本文介绍iOS视频采集的相关概念及视频采集的工作原理,后续将对采集后的视频数据进行硬编码、硬解码、播放等流程进行分析讲解。基本概念AVCaptureSession苹果为了管理从摄像头、麦克风等设备捕获到的信息,整了一个叫做AVCaptureSession的东西来对输入和输原创 2020-08-25 13:34:11 · 1660 阅读 · 0 评论 -
AutoreleasePool 的相关问题
(1)Autoreleasepool的实现原理:以栈为结点,由双向链表的形式合成的数据结构。 与线程一一对应。双向链表(2)@autoReleasePool经过编译器变异后,成为:void * ctx = objc_autoReleasePoolPush(); //ctx 就是哨兵对象所对应的位置。{}对应代码;objc_autoReleasePoolPop(ctx); objc_autoReleasePoolPush(); 的内部实现:调用了c++中的一个结构体:autoRe原创 2020-08-16 19:25:33 · 264 阅读 · 0 评论 -
awakeFromNib小总结
awakeFromNib在使用IB的时候才会涉及到此方法的使用,当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。看例子:创建一个viewController with XIB定义一个UIView的子类打开xib,并把Vi原创 2013-03-06 12:17:26 · 1730 阅读 · 0 评论 -
loadView用法
loadview:UIViewController类或其子类会在初始化时创建一个UIView对象,会作为控制器的默认视图显示出来,可以通过self.view寻址访问。但没有调用loadView方法时,self.view=nil。loadView在每一次使用self.view这个property,并且self.view为nil的时候被调用,用以产生一个有效的self.view。这个接口原本是为了原创 2013-03-06 13:40:20 · 1070 阅读 · 0 评论