通过isa走位图 得出的结论是: 1,类,父类,元类都包含了 isa, superclass 2,对象isa指向类对象,类对象的isa指向了元类,元类的 isa 指向了根元类,根元类 isa 指向自己 3,类的 superclass 指向父类,父类的 superclass 指向的根类,根类的superclass 指向的nil 4,元类的 superclass 指向父元类,父元类 superclass 指向的根元类,根元类 superclass 指向根类,根类 superclass 指向nil
泛型在 Swift 中主要为增加代码的灵活性而生:它可以使得对应的代码满足任意类型的变量或方法。 Swift 有五个级别的访问控制权限,从高到底依次为比如 Open, Public, Internal, File-private, Private。 Swift 的内存管理机制与 Objective-C一样为 ARC(Automatic Reference Counting)。它的基本原理是,一个对象在没有任何强引用指向它时,其占用的内存会被回收。反之,只要有任何一个强引用指向该对象,它就会一直存在于内存中。
UIEvent事件传递大致可以分为三个阶段: 1. Hit-Testing(寻找合适的 view) 2. Recognize Gesture(响应手势) 3. Response Chain(touch 事件传递, 响应事件)
本篇文章将为大家讲解下crash监控及防崩溃处理。 ● 如何收集crash ○ 利用bugly、友盟等第三方收集 ○ 监控crash原理 ● 防崩溃处理 ○ 常见崩溃类型 ○ 防崩溃处理方案 ■ hook方案 ■ 安全接口
oc与js交互 ● 拦截url ● JavaScriptCore(只适用于UIWebView) ● WKScriptMessageHandler(只适用于WKWebView) ● WebViewJavaScriptBridge(第三方框架) map、filter、reduce?map与flapmap的区别? ● map:数组中每个元素都经过某个方法转换,最后返回新的数组(xx.map({$0 * $0})) ● flatmap:同map类似,区别在flatmap返回的数组不存在nil,并且会把optional解包;而且还可以把嵌套的数组打开变成一个([[1,2],[2,3,4],[5,6]] ->[1,2,2,3,4,5,6]) ● filter:用户筛选元素(xxx.filter({$0 > 25}),筛选出大于25的元素组成新数组) ● reduce:把数组元素组合计算为一个值,并接收初始值()
XCode中,如果直接将 xxx.a 文件拖进到项目中,有时会出现异常。 error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: can't locate file for: -lxxx error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: file: -lxxx is not an object file (not allowed in a library)解决方法:在Build Settings选项中,找到Library Search Paths,将 xxx.a 所在的目录加入进去。 iOS只有设置AVAudioSessionCategoryPlayAndRecord时,才能在扬声器和听筒间切换。
2.谈谈 Session,Token,Cookie 的概念 关键词:#用户认证 #客户端 #服务器端 • Session 是服务器端用来认证、追踪用户的数据结构。它通过判断客户端传来的信息确定用户,确定用户的唯一标识是客户端传来的 Session ID。 • Token 是服务器端生成的一串字符串,是客户端进行请求的令牌、服务器端用以确定用户的唯一标识。Session ID 就经常被用作 Token 来使用。Token的出现避免了服务器频繁的查询用户名和密码,降低了数据库的查询压力。 • Cookie 是客户端保存用户信息的机制。初次会话 HTTP 协议会在 Cookie 里记录一个 Session ID ,之后每次把 Session ID 发给服务器端。 • Session 一般用于用户验证。它默认存在服务器的一个文件里,当然内存、数据库里也可以存储。 • 若是客户端禁用了 Cookie,客户端会用 URL 重写技术,即会话时在 URL 的末尾加上 Session ID,并发送给服务器端。
实现直播过程共享屏幕分为两个步骤:屏幕数据采集和流媒体数据推送。前对于 iOS 来说,屏幕采集需要系统的权限,受制于 iOS 系统的限制,第三方 app 并没有直接录制屏幕的权限,必须通过系统的功能来实现。 本文将描述 iOS 系统的屏幕共享的应用、实现、限制、实现细节等方面调研结果。(注:由于 iOS 10 和之前的系统只支持 App 内录制屏幕,所以只做简单的介绍,不做详细说明)
swift闭包是一个捕获了外部变量或者常量的函数,可以有名字的函数,可以是匿名的函数,也可以是不捕获外部变量的函数。所以可以说闭包是特殊的函数。 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 ObjC 中的代码块(blocks)比较相似。
delegate ● 准确的说是一种设计模式 ● iOS当中以@protocol形式体现 ● 传递方式一对一 ● delegate是使用通知者模式实现
一、Category: ● category编译的时候会生成相应的categor_t结构体,在运行时进行合并到类方法里面去, ● 分类的方法会放到原类方法列表的前面,固先调用,后加载的先调用 ● category编译的时候编译成结构体struct category_t,里面存储着分类的对象方法。类方法,属性,协议信息,在程序运行的时候,runtime会将category的数据合并到类信息中(类对象,元类对像) 特点: ● 运行时决议 ● 可以为系统类添加分类、方法 二、extension 延展、类扩展、特殊的分类、匿名分类 ● 为类添加私有的属性和方法,但是没有独立的实现(@implementation)必须依赖原类来实现方法,所以和原类的.m 文件写在一起。 ● 在编译后,成员变量就被添加到原类的成员变量中,方法被添加到原类的methodlist
如果你觉得 UITableViewDelegate 和 UITableViewDataSource 这两个协议中有大量方法每次都是复制粘贴,实现起来大同小异,看看这篇文章或许对你有所帮助
一、KVO的概念 ● KVO(Key Value Observing) 键值观察是苹果提供的一套事件通知机制,可以用于监听某个对象属性值的改变 ● KVO 不能监听成员变量 ● 与 NSNotificationCenter 一样,都是 iOS 观察者模式的一种实现。不同的是 KVO是一对一的,且一般情况下对被监听的对象无侵入性,不需要被监听对象修改代码。 ● 以 KVO 为模型慢慢衍生出来响应式编程的思想。 ● KVO 可以监听普通类型属性,也可以监听集合类型( NSArray / NSSet )的属性。 ● KVO 默认自动开启监听,也可以手动开启。 ● 注册与移除监听需要成对儿出现: ○ 如果重复移除监听,会报 NSRangeException 异常。 ○ 如果不移除,观察者释放后,再次发送 KVO 消息给它时,会报野指针的异常。 ○ 苹果官方推荐的方式是,在init的时候进行addObserver,在dealloc时removeObserver,这样可以保证add和remove是成对出现的,是一种比较理想的使用方式。
当CPU + GPU处理任务的时间 > 16.67 毫秒,就会出现掉帧现象。所以优化卡顿,要从CPU 、GPU两个方面入手。
手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性。iOS系统提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作。 ● UIPanGestureRecognizer(拖动) ● UIPinchGestureRecognizer(捏合) ● UIRotationGestureRecognizer(旋转) ● UITapGestureRecognizer(点按) ● UILongPressGestureRecognizer(长按) ● UISwipeGestureRecognizer(轻扫)
每一个UIView都有一个CALayer实例的图层属性,我们也可以通过UIView的layer属性访问这个图层。UIView的职责就是创建并管理这个图层,以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树中执行相同的操作。
1. 字节对齐的原则 1.1 结构体或者联合体的数据成员,第一个成员的存储位置从0开始,之后的每个成员的存储起始位置均为该成员的大小的整数倍。 ● 根据这条原则,上面的 Mystruct1 中 ○ 成员 a 占 1 个字节, 从 0 的位置开始 ○ 成员 b 占 8 个字节,挨 0 + 1 最近的 8 的整数倍是8,所以 b 从 8 的位置开始 ○ 成员 c 占 4 个字节,挨 8 + 8 最近的 4 的整数倍是16,所以 c 从 16 的位置开始 ○ 成员 d 占 2 个字节,挨 16 + 4 最近的 2 的整数倍是20,所以 d 从 20 的位置开始 ○ 一共是占 22 个字节,8 字节对齐,一定要是8的倍数,不足要补齐,所以是 24 个字节
一个 HTTP 超时问题最近有同事反映我们的 app 在网络正常的情况下偶尔会出现请求超时。我的第一反应是某个服务挂掉了(因为最近服务端再搞重构),就反馈给了服务层。但是服务层的同事排查下来发现 api 层并没有产生异常日志,应该不是服务本身或者依赖的中台服务挂掉了。定位想起来 NSURLSession 有个默认的单个Host最大连接数,超过之后会进入排队,可能导致后续服务超时。Objective
一、@synthesize & dynamic runtimer方法@synthesize: 修改变量名字,自动生成set和get并赋值.在以前的版本是没有自动生成set和get方法,往往定义一个变量,我们需要加这个东西,现在很少用;@dynamic:提醒编译器不要自动生成setter和getter方法、不要自动生成成员变量;@dynamic与@synthesize的区别@property
“我在秒杀iPhone XS的支付页面卡了3秒,最后没抢到”,用户嘶声力竭地反馈了一个卡顿问题。“莫慌莫慌”,等我打开Android Studio, 用上一讲学到的几个工具分析一下就知道原因了。“咦,在我这里整个支付过程丝滑般流畅”。这个经历让我明白,卡顿跟崩溃一样需要“现场信息”。因为卡顿的产生也是依赖很多因素,比如用户的系统版本、CPU负载、网络环境、应用数据等。脱离这个现场,我们本地难以复现
ArrayList和LinkedList在新增、删除元素时,LinkedList的效率要高于 ArrayList,而在遍历的时候,ArrayList的效率要高于LinkedList。
今天这篇文章是原生与前端共舞模块的第一篇,我来跟你聊聊前端和原生之间的桥梁 JavaScriptCore,看看它是什么、能做哪些事儿。 总结来说,JavaScriptCore 为原生编程语言 Objective-C、Swift 提供调用 JavaScript 程序的动态能力,还能为 JavaScript 提供原生能力来弥补前端所缺能力。 正是因为JavaScriptCore的这种桥梁作用,所以出现了很多使用 JavaScriptCore 开发 App 的框架 ,比如React Native、Weex、小程序、WebView Hybird等框架。 接下来,我们再回过头来看看,JavaScriptCore 的来头是啥,为什么这些框架不约而同地都要用 JavaScriptCore 引擎来作为前端和原生的桥梁呢? 要回答这个问题的话,你还需要了解JavaScriptCore 的背景。
简单几步解决在工作中MySql查询数据慢的问题
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号