Obj-C 零食铺
预处理 总览 宏指令 含义 #define 给一串代码指定一个常量,本质是「替换」 #include 一般用于导入头文件 #undef 将某个已经定义的宏移除 #ifdef...
预处理 总览 宏指令 含义 #define 给一串代码指定一个常量,本质是「替换」 #include 一般用于导入头文件 #undef 将某个已经定义的宏移除 #ifdef...
NS_UNAVAILABLE 简介 NS_UNAVAILABLE将方法标记为不可用,在类外调用该方法时会直接报错,提示'someMethod' is unavailable。但其实这个方法还能通过一些其他方式调用,比如performSelector 用处 禁用NSObject的init或者new方法,让开发者只能使用指定的初始化函数。 + (instancetype)new...
今天给自己的 Swift Package 仓库新增文件的时候,发现文件头的作者、时间、copy right 等信息不太全,一时兴起研究了一下。 一般来说,给 Xcode Project 新增文件时会带上 organization name。但是单独打开 Swift Package 时,是没有办法设置 organization name 的。这样新建的文件头部就会光秃秃的,不甚美观 一番研...
Dispatch Group Dispatch Group 在项目中比较常见,用于多任务多线程之间的协作。比如,使用两个队列分别请求不同的接口,等请求全部完成后,刷新页面。下面这段代码使用两个队列分别执行不同任务,当两个任务都完成后,通知主队列执行完成代码 import Foundation import PlaygroundSupport PlaygroundPage.current...
单例是常见的一种设计模式。最近在编写单例代码的时候,发现公司很多同事的 Swift 单例写法都是这样的, extension NSObject { @discardableResult static func kep_synchronized<T>(_ lock: AnyObject, closure: () -> T) -> T { ...
上周做新版本的新手引导需求的时候,写了下面一段代码 @objc func nextStep() { // 点击事件 if currentStepIndex < viewChain.count { viewChain[currentStepIndex].clickBlock?() } // 隐藏当前步骤,展示下一个步骤 if currentStepIndex + 1 &l...
UIButton的默认布局是图片在左,标题在右。想要得到一个图片在右,标题在做的UIButton,可以使用以下几种方法 方法一: 改变 Button 的语义属性 不同国家的文字书写方向不一样。在中国,文字书写方式是从左往右,因此UIButton的默认布局是图片在左;而在一些文字书写方向是从右往左的国家里,UIButton的默认布局是图片在右。UIView 有一个 semanticCont...
前两天在开发的时候遇到这样一个问题:想在 OC 代码中实现一个全局变量,这个变量会根据设备类型取不同的值。代码如下: static CGFloat cardLeftMargin = isIPAD ? 30 : 16; // 这里的 isIPAD 是个宏 在 swift 中很容易就能实现这个全局变量。但是在 OC 里面,上面的代码编译时报错了, Initializer element...
基础知识 iOS 多线程实现方式 Grand Central Dispatch (GCD): 自动管理线程生命周期 NSOperation: 自动管理线程生命周期,基于 GCD 实现 NSThread: 手动管理线程生命周期 并发和并行 并发: 并发不是真正的多线程,而是通过CPU(单核)在多个线程间快速切换调度,实现接近同时执行的效果 并行: 并行是真正的...
SwiftUI Adaptive Layout 使用 UIKit 写一套能够根据屏幕尺寸和方向自动更换布局的代码是比较麻烦的(至少从我目前的经验来看~),但是用 SwiftUI 来实现就会轻松一点。 在 SwiftUI 中,Apple 引入了一个概念 Size Classes (尺寸类型),且在横向和竖向两个维度上分别有 Horizontal Size Class 和 Vertical ...