Source Compatibility 代码兼容性 本次版本发布的XCode里,用户可以选择按照Swift3,Swift4或者Swift4.2来进行编译。...Runtime Optimization 运行时优化 在Swift4.2中,在变量调用的会话过程中,会采用一种Guranteed-Release的标注方式,取代之前Retain-Release的方式,减少中间无谓的...你猜对了,写个方法把里面每一元素都拿出来比较一次,如果都相等则整体返回相等。更郁闷的是,如果要在Struct中增加一个变量,还需要同步维护这个判等函数,就像下图一样,再次表示蛋疼。。。 ?...image.png 这一次,Swift4.2支持Equatable标签,会自动生成上述代码,大家再也不用自己手敲了,是不是很方便。 ?...Checking Platform Conditions 平台监测 在我们开发的过程中,会用到很多条件编译,尤其在iOS和MacOS共存的App中,经常会出现这种代码 ?
前言 本文分享iOS开发中遇到的问题,和相关的一些思考。 正文 一、Xcode10.1 import头文件无法索引 【问题表现】如图,当import头文件的时候,索引无效,无法联想出正确的文件; ?...【问题分析】通过多个文件尝试,发现并非完全不能索引头文件,而是只能索引和当前文件在同级目录的头文件; 有点猜测是Xcode10.1的原因,但是在升级完的半年多时间里,都没有出现过索引。...经过对比正常编译的.mm文件,找到一个解决方案: 1,添加NS_ASSUME_NONNULL_BEGIN在代码最前面,NS_ASSUME_NONNULL_END在代码最后面; 2、手动添加_Nullable到函数的参数...实现方式是计算得到富文本,然后赋值给UILabel,再调用-sizeToFit的接口。 ? 以上的问题仅在一行的时候出现异常,两行又恢复正常。 ?...这些问题有的很简单,仅仅是改个配置(如第一个Xcode索引问题),但是在解决过程中还是走了一些弯路,因为完全没想过可能会去改Workspace setting,都是在Build setting修改进行尝试
首先,UIViewController中与其生命周期有关的几个函数如下: //类的初始化方法 + (void)initialize; //对象初始化方法 - (instancetype)init; //...,乍一看什么复杂,其实关系什么明朗,除了initialize,init和initWithCoder不是存在所有对象的声明周期中,其他函数都会在UIViewController的声明周期中有序的被调用。...这是一个ViewController完整的声明周期,其实里面还有好多地方需要我们注意一下: 1:initialize函数并不会每次创建对象都调用,只有在这个类第一次创建对象时才会调用,做一些类的准备工作...4:viewDidLoad方法是我们最常用的方法的,类中成员对象和变量的初始化我们都会放在这个方法中,在类创建后,无论视图的展现或消失,这个方法也是只会在将要布局时调用一次。...,而重点是从代码加载的则只会在开始调用一次,之后都不会,所以注意,在layoutSubviews中写相关的布局代码十分危险。
本文用来介绍 iOS 开发中『Runtime』中的黑魔法 Method Swizzling。...开发:『Runtime』详解(一)基础知识 中,讲解了 iOS 运行时机制(Runtime 系统)的工作原理。...应该只在 +load 中执行 Method Swizzling。 程序在启动的时候,会先加载所有的类,这时会调用每个类的 +load 方法。而且在整个程序运行周期只会调用一次(不包括外部显示调用)。...+ load 方法的调用规则为: 先调用主类,按照编译顺序,顺序地根据继承关系由父类向子类调用; 再调用分类,按照编译顺序,依次调用; + load 方法除非主动调用,否则只会调用一次。...这样的话只需要在基类的 viewDidAppear: 中添加一次统计功能。
玩转iOS转场动画 一、引言 关于动画在iOS开发中的应用,曾经整理过一系列的博客进行总结。...://my.oschina.net/u/2340880/blog/539878 iOS中播放gif动态图的方式探讨:https://my.oschina.net/u/2340880/blog/608560...*)source NS_AVAILABLE_IOS(8_0); 我们先来看上面的前两个函数,这两个函数都要返回一个实现了UIViewControllerAnimatedTransitioning协议的对象...; //转场动画完成时调用 - (void)completeTransition:(BOOL)didComplete; //获取转场中的两个视图控制器 /* UITransitionContextViewControllerKey...3个函数而不需要我们自己重写了,但是必须实现UIViewControllerAnimatedTransitioning协议中的transitionContext函数来实现动画效果。
Responder Chain: I 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,我们称之为“响应者对象”。...iOS中的响应者链(Responder Chain)是用于确定事件响应者的一种机制,其中的事件主要指触摸事件(Touch Event),该机制和UIKit中的UIResponder类紧密相关。...当触摸事件发生后,系统会将触摸事件以UIEvent的方式加入到UIApplication的事件队列中,UIApplication将事件分发给根部的UIWindow去处理,UIWindow则开始调用hitTest...4.2.响应者链 通过命中测试找到命中者后,任务并没有完成,因为最终的命中者不一定是事件的响应者。...所谓的响应就是开发中为事件绑定的一个触发函数,事件发生后执行响应函数里的代码,例如通过addTarget方法为按钮的单击事件绑定响应函数,在按钮被单击后能及时执行想要执行的任务。
一般是用于字符串( NSString,NSMutableString),数组(NSMutableArray,NSArray),字典对象,视图对象(UIView ),控制器对象(UIViewController...因为 ios5用的是 weak ,那在ios4.3就用不了,如果你将 weak 修改为 unsafe_unretained ,那就可以用了。...说到底就是iOS 5之前的系统用该属性代替 weak 来使用。...这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。...@propery(setter=setAbc,getter=isRich) BOOL rich; BOOL b=p.isRich;// 调用
1.1 方法与消息发送 消息在OC中方法调用是一个消息发送的过程。OC方法最终被生成为C函数,并带有一些额外的参数。这个C函数objc_msgSend就负责消息发送。...在编译时你写的 OC 函数调用的语法都会被翻译成一个 C 的函数调用 objc_msgSend() 。...如果你添加了函数并返回 YES, 那运行时系统就会重新启动一次消息发送的过程。...调用新API时,由于没有具体对应API实现,我们将其原有的消息转发至当前栈顶UIViewController去调用低版本API。...4.2 消息机制总结 ? Objective-C 中给一个对象发送消息会经过以下几个步骤: 在对象类的 dispatch table 中尝试找到该消息。
一、视图控制器 UIViewController采用懒加载的方式,也就是说第一次访问到view属性时才会加载或创建它。...这需要我们在loadView 方法中,通过编程创建自己的视图层次,并且把把根视图赋值给UIViewController的view属性。...每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。...三、UIView生命周期其他点 layoutSubviews的被调用的时机: addSubview会触发layoutSubviews,比如viewA add viewB,第一次添加A和B的layoutSubviews...iOS_applicationDidEnterBackground 点击程序图标进入: iOS_applicationWillEnterForeground iOS_applicationDidBecomeActive
---- 4、Leaks 4.1、前置设置 首先,修改编译设置生成符号信息,以便 Leaks 分析出调用堆栈函数符号: Target -> Build Settings -> Build Options...-> Debug Information Format -> Debug -> DWAPR with dSYM File 否则 Leaks 无法解析调用堆栈函数名: no stack trace is...: 4.3.3、Call Tree页面 点击中间栏的左侧切换到Call Tree统计模式,也可通过底部栏的工具进行过滤 Separate By Thread:线程分离,在调用路径中能够清晰看到占用内存最大的线程...Invert Call Tree:反转调用堆栈顺序 Hide System Libraries:隐藏系统库的调用堆栈信息 Flatten Recursion:会将调用栈里递归函数作为一个入口(很少使用...然后在UIViewController的dismiss方法里调用willDealloc:遍历 childVCs、presentVCs和subViews触发他们的willDealloc方法检测是否有泄露:
加载循环: 1 程序请求了controller的view. 2 如果view当前不在内存中,controller调用loadview函数。 ...如果view可以被释放,那么这个函数释放view并调用viewDidUnload。你可以重载这个函数来释放controller中使用的其他内存。...但要记得调用这个函数的super实现来允许父类(一般是UIVIewController)释放view。...如果你的ViewController保存着view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。...UITabBarController 4. addChildViewController(一般用于自定义的继承于 UIViewController 的容器子类) iOS5,调用- (void)transitionFromViewController
从 FlutterViewController 开始 在混合开发中,我们使用 Flutter 作为插件化开发,需要起一个 FlutterViewController,这是一个 UIViewController...我们还是以 2.4 中 FLBFlutterViewControllerviewWillAppear 来举例吧,可以看到在这个函数中会执行 willShowPageContainer,它的实现在 BoostMessageChannel.m...4.1 调用 4.1.1 从 Native 打开页面 从 iOS 业务侧调用 openUrl 即可打开 Native 或 Flutte 页面: - (IBAction)pushNativePage:(id...onCreate 函数,至于剩下的业务,是对页面指针的处理,这里不做分析了。...之后调用 thrio_pushViewController,这段逻辑和之前分析的 4.2 打开 Native 页面是一样的: - (void)thrio_pushViewController:(UIViewController
交换两个方法的实现一般写在分类的load方法里面,因为load方法会在程序运行前加载一次,而initialize方法会在类或者子类在 第一次使用的时候调用,当有分类的时候会调用多次。...1.3 Method swizzling的时机 如果使用恰当,Method swizzling 还是很安全的,一个简单安全的方法是,仅在load中swizzle ,在 dispatch_once 中完成...ps :initialize 会在类第一次接收到消息的时候调用 有继承关系的对象swizzle时,先从父对象开始。这样才能保证子类方法拿到父类中的被swizzle的实现。...1.initialize 会在类第一次接收到消息的时候调用 2.先调用父类的 initialize,然后调用子类。...2.4 适配iOS13的模态的的样式问题 h /** 模态只处理13以上的 */ @interface UIViewController (ERPPresent13) /** Whether or
; 复制代码 在Storyboard使用Safe Area最低只支持iOS9,iOS8的用户就要放弃了 当UIViewController调用- (void)viewDidLoad时它的所有子视图的...iOS系统版本的不同而不同,iOS10中字体变大了。...在iOS 10 中,系统会cell保存一段时间,也就是说当用户把cell滑出屏幕以后,如果又滑动回来,cell不用再走一遍生命周期了,只需要调用willDisplayCell方法就可以重新出现在屏幕中了...4.2、HTTP 请求失败 iOS9 默认不支持 HTTP 请求,需要改用更安全的 HTTPS(默认用 TLS 1.2)。...中废弃的方法 // 修改状态栏的样式为白色 // 'setStatusBarStyle(_:animated:)' was deprecated in iOS 9.0: Use -[UIViewController
UIApplication单例实现原理 首先我们知道UIApplication对象是单例创建的,也就是说程序中UIApplication对象只创建一次,我们不能再新建UIApplicaiton对象。...1.不能外界调用alloc,一调用就崩掉,抛出异常,(第一次调用alloc就不崩溃,其他都崩溃) 2.提供一个方法给外界获取单例(shareApplication) 3.程序启动的时候内部创建一次单例...UIApplicaiton的代理名称 NSStringFromClass([AppDelegate class] 相当于 @"AppDelegate"; 此时我们可以根据UIApplicationMain函数了解程序启动的过程...联网指示器显示效果图 管理状态栏 从iOS7开始,系统提供了2种管理状态栏的方式 a.通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)在iOS7...中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式 状态栏的样式 - (UIStatusBarStyle
而VC.NET提供的函数宏为: __FUNCTION__ 函数,提供类名和函数名称的输出。...中的视图调试(ios8苹果引入了强大的新技术,不可不看) http://blog.csdn.net/openglnewbee/article/details/42195361 2.3.1 ios8以前调试控制台命令.../xcode6中Debug View Hierarchy功能 在ios8/xcode6以后,苹果引入了新的技术手段支持我们进行实时ui调试;使用xcode运行app过程中,按下底部的Debug... 所以根据这点,我们可以处理在不同版本之间某些方法的切换 #ifdef __IPHONE_6_1 methodOne; #else methodTwo; #endif 4.2... 系统版本判断 4.2.1 IOS开发中如何区分IOS版本 // 当前系统支持的最小版本 __IPHONE_OS_VERSION_MIN_REQUIRED // 当前系统支持的最大版本 __IPHONE_OS_VERSION_MAX_ALLOWED
UIView与UIViewController 初步印象 iOS 开发中,一个界面就是一个 UIViewController(视图控制器),界面上显示的内容就是 UIView(视图)。...UIView与UIViewController的关系 UIViewController 中默认有一个和屏幕一样大的 UIView,UIViewController 管理着它的生命周期。...所有放在界面上的 UI 控件都放在 UIViewController 的 UIView 之上,在 UIViewController 的代码中可以通过self.view属性获取它。...开发中的其他 UIView(及其子类)都放在该view上。 UIViewController中UIView的生命周期函数 viewDidLoad:View 完成内存加载。...与 Storyboard 中的 UIView 产生的事件建立联系。 当相应的事件发生时,方法就会被调用。 只有继承自 UIControl 的 UI 控件可以拖拽 @IBAction。
UIWindow/使用纯代码加载根控制器 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow -iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的...不要直接调用 - (void)becomeKeyWindow; //为子类提供。...UIWindow的创建过程 2.1 在有storyboard中的创建过程 先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application 创建代理,并且把代理设置给...5.4.2 在纯代码中的创建过程 先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application 创建代理,并且把代理设置给application 开启一个事件循环...,当程序加载完毕,调用代理的didFinishLaunchingWithOptions:方法。
,可以在下文提到的 hitTest 函数中加入断点,看一下相关函数的调用情况。...苹果回复[2] 在hitTest函数中拿到的 UIEvent 对象,其allTouches属性为空,等到下文所提到的发送事件时,在sendEvent函数中拿到的 UIEvent 对象,其allTouches...发送事件 在寻找到第一响应者之后,UIApplication 便会调用sendEvent函数发送事件到 UIWindow,然后 UIWindow 调用sendEvent函数发送事件到第一响应者进行响应,...顺序如下: UIApplication -> UIWindow -> hit-tested view 我们可以在touchesBegan函数中加入断点查看相关函数调用验证这一过程 发送事件-方法调用...的触摸事件不会调用,当手势识别失败时才开始调用 touchesBegan 函数。
: SceneDelegate的最重要的函数,相当于iOS 12上的 application(_:didFinishLaunchingWithOptions:) 函数。...当将scene添加到app中时scene(_:willConnectTo:options:)函数会被调用的,因此在这里对scene进行配置。...中AppDelegate中新增的两个函数是负责管理Senen Session的代理函数。...application(_:didDiscardSceneSessions:) : 在分屏中关闭其中一个或多个scene时候回调用,可以在该函数中销毁场景所使用的资源。...该方法与application(_:didDiscardSceneSessions:)的区别是,该方法仅在场景断开连接时调用,不会被丢弃,它可能会重新连接。
领取专属 10元无门槛券
手把手带您无忧上云