首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift 4.2新特性——WWDC2018 Session401笔记

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,经常会出现这种代码 ?

1.3K20

iOS开发笔记(十)— Xcode、UITabbar、特殊机型问题分析

前言 本文分享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修改进行尝试

1.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

iOSUIViewController生命周期和属性方法的解析

首先,UIViewController与其生命周期有关的几个函数如下: //类的初始化方法 + (void)initialize; //对象初始化方法 - (instancetype)init; //...,乍一看什么复杂,其实关系什么明朗,除了initialize,init和initWithCoder不是存在所有对象的声明周期中,其他函数都会在UIViewController的声明周期中有序的被调用。...这是一个ViewController完整的声明周期,其实里面还有好多地方需要我们注意一下: 1:initialize函数并不会每次创建对象都调用,只有在这个类第一次创建对象时才会调用,做一些类的准备工作...4:viewDidLoad方法是我们最常用的方法的,类成员对象和变量的初始化我们都会放在这个方法,在类创建后,无论视图的展现或消失,这个方法也是只会在将要布局时调用一次。...,而重点是从代码加载的则只会在开始调用一次,之后都不会,所以注意,在layoutSubviews写相关的布局代码十分危险。

2.9K20

iOS 开发:『Runtime』详解(二)Method Swizzling

本文用来介绍 iOS 开发『Runtime』的黑魔法 Method Swizzling。...开发:『Runtime』详解(一)基础知识 ,讲解了 iOS 运行时机制(Runtime 系统)的工作原理。...应该只在 +load 执行 Method Swizzling。 程序在启动的时候,会先加载所有的类,这时会调用每个类的 +load 方法。而且在整个程序运行周期只会调用一次(不包括外部显示调用)。...+ load 方法的调用规则为: 先调用主类,按照编译顺序,顺序地根据继承关系由父类向子类调用; 再调用分类,按照编译顺序,依次调用; + load 方法除非主动调用,否则只会调用一次。...这样的话只需要在基类的 viewDidAppear: 添加一次统计功能。

1.8K31

iOS 小技能: Responder Chain(响应者链)【上篇】

Responder Chain: I 响应者对象 在iOS不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,我们称之为“响应者对象”。...iOS的响应者链(Responder Chain)是用于确定事件响应者的一种机制,其中的事件主要指触摸事件(Touch Event),该机制和UIKit的UIResponder类紧密相关。...当触摸事件发生后,系统会将触摸事件以UIEvent的方式加入到UIApplication的事件队列,UIApplication将事件分发给根部的UIWindow去处理,UIWindow则开始调用hitTest...4.2.响应者链 通过命中测试找到命中者后,任务并没有完成,因为最终的命中者不一定是事件的响应者。...所谓的响应就是开发为事件绑定的一个触发函数,事件发生后执行响应函数里的代码,例如通过addTarget方法为按钮的单击事件绑定响应函数,在按钮被单击后能及时执行想要执行的任务。

1K30

iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)

1.1 方法与消息发送 消息在OC中方法调用是一个消息发送的过程。OC方法最终被生成为C函数,并带有一些额外的参数。这个C函数objc_msgSend就负责消息发送。...在编译时你写的 OC 函数调用的语法都会被翻译成一个 C 的函数调用 objc_msgSend() 。...如果你添加了函数并返回 YES, 那运行时系统就会重新启动一次消息发送的过程。...调用新API时,由于没有具体对应API实现,我们将其原有的消息转发至当前栈顶UIViewController调用低版本API。...4.2 消息机制总结 ? Objective-C 给一个对象发送消息会经过以下几个步骤: 在对象类的 dispatch table 尝试找到该消息。

1.7K11

iOS_Memory Leak 内存泄露治理

---- 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方法检测是否有泄露:

39420

Flutter 混合开发框架模式探索

从 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

2.2K10

iOS 小技能:Method Swizzling (交换方法的IMP)

交换两个方法的实现一般写在分类的load方法里面,因为load方法会在程序运行前加载一次,而initialize方法会在类或者子类在 第一次使用的时候调用,当有分类的时候会调用多次。...1.3 Method swizzling的时机 如果使用恰当,Method swizzling 还是很安全的,一个简单安全的方法是,仅在loadswizzle ,在 dispatch_once 完成...ps :initialize 会在类第一次接收到消息的时候调用 有继承关系的对象swizzle时,先从父对象开始。这样才能保证子类方法拿到父类的被swizzle的实现。...1.initialize 会在类第一次接收到消息的时候调用 2.先调用父类的 initialize,然后调用子类。...2.4 适配iOS13的模态的的样式问题 h /** 模态只处理13以上的 */ @interface UIViewController (ERPPresent13) /** Whether or

1.4K10

iOS-UIApplication详解iOS-UIApplication详解

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

1.5K70

IOS开发进阶系列】IOS常用开发技巧专题

而VC.NET提供的函数宏为: __FUNCTION__ 函数,提供类名和函数名称的输出。...的视图调试(ios8苹果引入了强大的新技术,不可不看) http://blog.csdn.net/openglnewbee/article/details/42195361 2.3.1 ios8以前调试控制台命令.../xcode6Debug 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

30840

iOS14开发-入门知识

UIView与UIViewController 初步印象 iOS 开发,一个界面就是一个 UIViewController(视图控制器),界面上显示的内容就是 UIView(视图)。...UIView与UIViewController的关系 UIViewController 默认有一个和屏幕一样大的 UIView,UIViewController 管理着它的生命周期。...所有放在界面上的 UI 控件都放在 UIViewController 的 UIView 之上,在 UIViewController 的代码可以通过self.view属性获取它。...开发的其他 UIView(及其子类)都放在该view上。 UIViewControllerUIView的生命周期函数 viewDidLoad:View 完成内存加载。...与 Storyboard 的 UIView 产生的事件建立联系。 当相应的事件发生时,方法就会被调用。 只有继承自 UIControl 的 UI 控件可以拖拽 @IBAction。

2.8K40

iOS四大对象之UIWindow及四大对象之间的关系1. UIWindow使用纯代码加载根控制器2. UIWindow的创建过程3. 四大对象之间的关系

UIWindow/使用纯代码加载根控制器 UIWindow是一种特殊的UIView,通常在一个app只会有一个UIWindow -iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的...不要直接调用 - (void)becomeKeyWindow; //为子类提供。...UIWindow的创建过程 2.1 在有storyboard的创建过程 先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application 创建代理,并且把代理设置给...5.4.2 在纯代码的创建过程 先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application 创建代理,并且把代理设置给application 开启一个事件循环...,当程序加载完毕,调用代理的didFinishLaunchingWithOptions:方法。

1.7K30
领券