在NSObject的分类(NSObject+LG)里面定义并实现了sayMaster方法:
上面的代码中,如果我们覆写了该类的allocWithZone方法,那么就会走到第31行的逻辑;不过一般而言我们是不会自己去覆写allocWithZone方法的,所以一般都会走第8~28行的逻辑。
YYKit出现了很长时间了,一直想要详细解析一下它的源码,都是各种缘由推迟了。 最近稍微闲了一点,决定先从最简单的YYModel开始吧。 首先,我也先去搜索了一下YYModel相关的文章,解析主要API和用法的居多,也有很多人大呼看不懂。其实主要还是要静下心来看,因为YY用了很多并不常见,也不常用的底层API,你一个个去查官方文档会发现,他们并不难。
在 JNI 去调用 Java 的方法和访问字段时,最先要做的操作就是获得对应的类以及对应的方法 id。
如何打开该打印 可以通过查看log来发现实现了resolveInstanceMethod的方法
xadmin通过实现自己的BaseAdminView(继承自Django的View)来完成xadmin后台界面的处理。在解决一个csrf的问题时,翻了下xadmin BaseAdminView和Django的View部分的代码,关键点少了一条 update_wrapper 使用。导致我的小伙伴调试了半天。
众所周知 Python 跟 Java 一样,一切皆对象,所以 class 类也是对象,而对象可以动态创建,所以一个 class 类也可以被动态创建出来。
在前面的文章说过,Runtime 是一个用C、汇编编写的运行时库。 在底层汇编里面如果需要调用 C 函数的话,苹果会为其加一个下划线_, 所以查看objc_msgSend函数的实现,需要搜索_objc_msgSend(objc-msg-arm64.s(objc4))。
系统自动维护已准备好的SQL语句(“查询”)的缓存。这允许重新执行SQL查询,而无需重复优化查询和开发查询计划的开销。缓存查询是在准备某些SQL语句时创建的。准备查询发生在运行时,而不是在编译包含SQL查询代码的例程时。通常,PREPARE紧跟在SQL语句的第一次执行之后,但在动态SQL中,可以准备查询而不执行它。后续执行会忽略PREPARE语句,转而访问缓存的查询。要强制对现有查询进行新的准备,必须清除缓存的查询。
在上一篇文章中介绍了在汇编部分的缓存快速查找流程。由于首次调用或者缓存扩容等问题导致的缓存查找失败,就需要进入慢速查找流程.
settings.py中加入以下内容,your_host_ip换成你的服务器地址,yoursecret换成你的服务器密码
现在越来越多的app都使用了JSPatch实现app热修复,而JSPatch 能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是动态语言,OC 上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名/方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,理论上你可以在运行时通过类名/方法名调用到任何 OC 方法,替换任何类的实现以及新增任意类。今天就来详细解析一下OC中runtime最为吸引人的地方。
如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近1000种(并且是无限级分类的树型结构),如果按常规统计方法,每个分类ID都去count一下(同时考虑到每个分类的下级子分类产品数),这样的处理效率肯定很低的。 想了个办法从二个层面优化: 1.数据库层面 创建一个临时表,用游标把产品总数分类事先统计好,一次性在数据库中完成,避免ASPX页面中的多次查询请求。 -- ============
Class的结构 通过上一章中对isa本质结构有了新的认识,今天来回顾Class的结构,重新认识Class内部结构。 首先来看一下Class的内部结构代码,对探寻Class的本质做简单回顾。 struct objc_class : objc_object { // Class ISA; Class superclass; cache_t cache; // formerly cache pointer and vtable class_data_bit
在Object-C语言中,方法在调用之后都会被缓存起来,在下一次调用的时候就会去缓存中拿取,缓存方法的地方是一个叫cache_t的结构。本文基于源码分析cache_t的结构原理。
在上篇文章应用程序的加载——dyld动态链接器的工作流程中,我们聊了动态链接器dyld,知道了dyld最终会走到objc库的初始化函数_objc_init,接下来我们就来分析一下这个函数。
json与模型的转换框架很多,YYModel 一出,性能吊打同类组件,终于找了些时间观摩了一番,确实收益颇多,写下此文作为分享。
问题场景 背景:现在很多公司使用对象存储服务来存储静态文件/图片等,充分利用云上功能实现数据处理(数据万象),如COS的缩放/裁剪等功能;同时通过CDN的加速能力,提升访问质量。 问题:文件删除,可能来自第三方的投诉;可能来自违规;可能来自公司本身业务需要等等;COS文件删除,CDN需要刷新缓存;如果用了数据处理能力,比如万象,可能会产生同一个key,数个URL,都需要刷新缓存。 解决: 单key-单path场景,如key为/aaa/bbb.jpg,删除的缓存也只有/aaa/bbb.jpg的场景
Runtime 消息发送与转发流程总是大家关注的重点,却常常忽略方法缓存机制这个显著提升 objc_msgSend 性能的幕后功臣。
前一段时间有朋友问了下面的这个问题,我给出的回答是这样的: 其实上面回答的方法调用也都是基于以前对runtime的理解,和自己试验出来的结果,但是,回答完这个问题之后,抱着探究到底的精神(其实是这几天
方法调用的本质 本文我们探寻方法调用的本质,首先通过一段代码,将方法调用代码转为c++代码查看方法调用的本质是什么样的。 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m [person test]; // --------- c++底层代码 ((void (*)(id, SEL))(void *)objc_msgSend)((id)person, sel_registerName("test")); 通过上述源码可以看出c++底层代码
通过前面文章的介绍,我们已经对rw和ro之间的关系有过了解了,本篇文章首先通过一个面试题来加深下诸位对ro和rw的理解,也进一步熟悉下Runtime的API。
运行时计划选择(RTPC)是一个配置选项,它允许SQL优化器利用运行时(查询执行时)的离群值信息。运行时计划选择是系统范围的SQL配置选项。
系统在高并发场景下,最有用的三个方法是缓存,限流,降级。 缓存就是其中之一,目前缓存基本上是用redis或者memcached。 redis和memcached的优势,劣势在哪里,这里就不细说了,各位看官自行研究。 对于一些不经常更新的数据,比如说热门文章等等类的数据, 做缓存能减少数据库的压力。 其实做缓存也简单,在查询地方判断有没有缓存,没有就读数据库,然后缓存结果,有就直接读缓存,返回结果。 这样做没问题,问题是需要开发人员去关心每个方法,都要写一遍判断,不够通用。 于是有人说,能不能像别的框架一样,
CacheLookup Normal,objc_msgSend(sel,imp)
常说Objective-C是一门动态语言,那么问题来了,这个动态表现在那些方面呢?
Objective-C的面向对象都是基于C/C++的数据结构——结构体实现的。 我们平时使用的所有对象都是id类型,id类型对象对应到runtime中,就是objc_object结构体。
今天继续来为大家解读今年的 Google I/O ,我会重点为大家解读前端开发者应该关注的信息
是把照妖照,pom.xml用它照照,所有传递性依赖都将无处遁形,并且会以层级树方式展现,非常直观。
单例模式是一种创建型设计模式,用于确保一个类只能有一个实例,并提供一种方式来访问该实例。意思是无论何时创建这个类的对象,都会返回相同的实例。
是一个hash表, 对应的元素是bucket_t, 初始尺寸是2的1次方, 最大尺寸是2的16次方
LRU是常见的缓存淘汰策略,用于分布式系统的缓存、页表置换等场景。然而,经典的哈希链表实现事实上并不是很好的实现策略。
作者简介 建成,携程高级前端开发,对前端工程化、性能优化、效率提升等方面有浓厚兴趣。 背景 对于一款互联网产品来说,用户体验始终扮演着重要的角色,尤其是在后互联网时代,增量见顶,竞争方向逐渐转为存量用户,体验的好坏可能直接决定着一个用户的去留。 据统计,网页加载时间从 1 秒增加到 3 秒,跳出率就会提高 32%;如果网页加载时间从 1 秒增加到 6 秒,跳出率就会上升 106%。 基于此,携程金融前端团队对内部SSR应用的性能实施了一系列的治理,本文将从性能监测、数据处理与分析、优化之路等方面来分享。
Python 的类中,所有以双下划线__包起来的方法,叫魔术方法,魔术方法在类或对象的某些事件发出后可以自动执行,让类具有神奇的魔力,比如常见的构造方法__new__、初始化方法__init__、析构方法__del__,今天来聊一聊__new__的妙用,主要分享以下几点:
在 Native 代码中有时候会接收 Java 传入的引用类型参数,有时候也会通过 NewObject 方法来创建一个 Java 的引用类型变量。
定义一个扩展到sqlalchemy.ext.declarative系统的系统,自动生成从数据库模式到映射类和关系,通常而不一定是一个反射的数据库模式。
上一篇文章分析了 objc_msgSend 的汇编实现,这边文章继续分析 objc_msgSend 中缓存的查找逻辑以及汇编代码是如何进入 c/c++ 代码的。
没错,新版本的Redis已经到了候选发布状态(RC版),几个月后,你就可以在各大应用市场看到新版本的Redis了。我想这大概是迄今为止,Redis最接近“企业级”应用的一个版本了,有趣的是,在这之前我花了很长时间来理解什么是企业级应用。我认为我并不喜欢这个词,但是它还是有一些意义的。现在Redis可以说是无处不在,并且仍然能够“缩小规模”:你可以直接下载它,在30秒内完成编译,然后在不需要进行任何配置的情况下启动它。但是无处不在意味着加密和ACL之类的环境也是必须要支持的,因此Redis必须要感谢我,尽管我极力追求简单性。
实在是因为python中对象方面的内容太多、太乱、太杂,在写相关文章时比我所学过的几种语言都更让人"糟心",很多内容似独立内容、又似相关内容,放这也可、放那也可、放这也不好、放那也不好。
概述 常说Objective-C是一门动态语言,那么问题来了,这个动态表现在那些方面呢? 其实最主要的表现就是Objective-C将很多静态语言在编译和链接时做的事情放到了运行时去做。 它在运行时实现了对类、方法、成员变量、属性等信息的管理机制,同时,运行时机制为我们开发过程提供很多便利之处,比如: 在运行时创建或者修改一个类; 在运行时修改成员变量、属性等; 在运行时进行消息分发和分发绑定; ...... 与之对应实现的就是Objective-C的Runtime机制。 Runtime基本是C和汇编编写的
是 「山月七八月原创计划」 中的「第五篇」文章,简述了在 Node 服务中的全链路日志如何串起来
本文要讲的就是其中的第一个环节——数据采集与上报。下图是本文要讲述内容的大纲,大家可以先大致了解一下:
1)在 spark-env.sh 中设置 SPARK_DAEMON_MEMORY=2g 来解决该问题,此处画个图来了解一下shs:
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 使用场景:
Tips:苹果公开的源代码在这里可以查,https://opensource.apple.com/tarballs/
当static的修饰符出现是,表明该变量为静态变量,当我们为一个局部静态变量赋一个局部引用时(jstring,jclass,jint等),gc有可能会因为内存不够自动触发,回收局部引用,这时,局部静态变量就会出现野指针,如果不作异常处理则程序崩溃
单例模式,顾明思议。单独的实例模式,其表达的意思即字面意思。它要解决的问题就是全局只能存在一个这样的类,或者说存在一个这样的类就可以满足业务需要了。
领取专属 10元无门槛券
手把手带您无忧上云