【pid算法源码】【liteide无法跳转源码】【论文源码如何查找】oc源码

1.ocԴ?源码?
2.使用盗版oc会被发现吗
3.如何在swift中实现oc中的分类
4.OC内存管理-runloop

oc源码

ocԴ??

       自动修改/翻新/混淆/OC/iOS代码,自动替换类名,源码方法名

       由来

       网上有很多关于如何混淆iOS源码的源码方法,但是源码都不够智能,生成的源码方法类名要么千奇百怪,要么aaaabbbxxx这种完全毫无意义的源码pid算法源码名称,要么只能修改单个文件,源码多个文件根本无法关联,源码我就想有什么方法可以像真人一样去修改源码,源码符合语义,源码不是源码胡编烂造的方法名,还可以自动修改相关联的源码liteide无法跳转源码文件, 还能自己自定义单词库,于是源码就有了这个工具。

       演示视频

       划重点

       1. 该工具可以让你一键翻新代码,源码但是源码不是生成完整的xcode项目,需要你自己新建一个xcode项目,然后把翻新的文件拖入到新的项目中。

       2. 该工具只要是ipa都可以,不限制OC,Swift,Flutter,React Native,H5类app。论文源码如何查找

       3.目前免费使用,免费使用,免费使用,重要的事情说三遍

       几个效果展示

       使用说明

       下载项目,官网下载:IpaGuard官网--IOS 应用程序ipa文件混淆加密保护工具注意:说明中提到的路径均为绝对路径,提到的逗号,都为英文逗号。使用工具运行成功后,需要自己新建OC项目再将修改后的代码与资源文件拖入新建的工程。功能说明:

       未来可能添加的功能:说明文档会不定期更新,如遇到问题先检查是否依照说明文档的定义进行配置。

       1. 源文件路径/import_path(必选)

       OC项目文件路径包含代码文件与资源文件

       如下图

       2. 导出路径/export_path(必选)

       OC项目导出路径。cci文华财经源码

       注意,本工具并不能帮你生成完整的OC项目,只会生成OC代码文件和复制修改项目内部的资源

       3. 直接复制的路径/copy_only_pathes(可选)

       直接复制,忽略的文件名,多个路径以,逗号隔开

       4. 直接复制的文件名(不包含后缀)/copy_only_names(可选)

       直接复制,忽略的文件名,不包含后缀

       例:UISheetView.h 只需要输入UISheetView,多个文件用, 逗号隔开(注意全半角,逗号为英文逗号)

       5. 不进行修改的文件或文件夹/no_change_pathes(可选)

       深度读取,但是不会进行更改,如果引入了其他修改了的文本输入窗口源码类,会相应的修改深度读取(说明):会读取文件内部的类比与项目内其他类进行关联例:xxxx/Classes/Models 不想修改,则输入这个文件夹的绝对路径, 如只输入Models,则所有包含名为Models的文件或文件夹都会标记为只读取不修改,多个文件和类用, 逗号隔开(注意全半角,逗号为英文逗号)

       6. 不修改的文件或类的前缀名(区分大小写)/no_change_class_prefix_names(可选)

       例:不想所有以MJ开头的类或文件,则输入MJ, 多个文件和类用,逗号隔开(注意全半角,逗号为英文逗号)

       7. 不修改的文件后缀名(区分大小写)/no_change_class_prefix_names(可选)

       如第六条。Model,Info -->不修改以Model,Info为结尾的文件或类

       8. 只修改类名的文件名或类名/only_change_clsname_names(可选)

       深度读取,只修改类名,不修改内部属性与方法,这个优先级最低,如果之前的条件包含了本参数中的路径,则不生效

       9. 只修改类名的文件夹/文件路径/only_change_clsname_pathes(可选)

       深度读取,只修改类名,不修改内部属性与方法的文件名,这个优先级最低,如果之前的条件包含了本参数中的路径 则不生效

       . 动词词库路径/verbwords_path(可选)

       提供单词数组json文件路径 修改的命名逻辑为ABAB型,A为动词,B为名词,例:getMessage

       . 名词词库路径/nounwords_path(可选)

       提供单词数组json文件路径 修改的命名逻辑为ABAB型,A为动词,B为名词,例:getMessage

       . 类名前缀/class_prefix(可选)

       给每个类添加的前缀例:MJExtension-> MJ 为前缀, SD_ScrollView-> SD_ 为前缀

       . 属性名前缀/property_prefix(可选)

       给每个属性添加的前缀例:property(nonatomic, strong) UIViewMJView-> MJ 为前缀, property(nonatomic, strong) UIView SD_View-> SD_ 为前缀

       . 需要过滤的方法路径/filter_methods_path(可选)

       把你需要过滤的方法写入一个文本文件,然后将该文本路径填入到此项输入框注意事项:其他说明:本工具已经过滤了大多数常用系统方法,大部分情况下不需要配置此项。

       . 类名和属性名后缀路径/property_subfix_path(可选)

       给每个属性添加的后缀,需要一个配置json文件路径json格式:注意:key一定要与上面一直,否则系统无法读取,工具会遍历数组,为对应的类匹配后缀,在配置改文件时,包含相同字符串的类,需要将类名更长的类放在前面,不然匹配结果会达不到预期。例如:UITableView与UIView,配置时需要将UITableView放在View之前,如上面的例子。

       . 为方法名添加介词/add_preposition(可选)

       工具内置了所有介词,可选择性添加例:getMessage添加介词后-> getAMessage or getTheMessage具体介词完全随机添加

       . 修改分类/change_category(可选)

       工具会自动识别分类,可选择是否修改

       . 将原代码行作为注释写入/add_original_comments(可选)

       由于本工具不保证修改后百分百不报错,将修改过原属性声明和方法名作为注释写入,方便在重建工程后报错与原工程进行对照,建议设置

       . 修改方法内部局部变量名/change_local_property(可选)

       定义在方法内部的局部变量,可选择是否修改

       . 综合配置路径(可选)

       json配置文件路径,内部必须为字典,key为说明条目标题后面的英文请注意:配置文件优先级高于输入框输入的规则,配置文件存在时, 输入框输入的配置不生效例:(可直接复制修改)

       关于bug

       虽然工具本身经过了完整的商业项目的考验,但由于每个人的代码风格不一样,工具不可避免会出现解析不了的情况,开发者建议过滤C语言的文件,与第三方库,减少出错的可能性,还是无法运行成功,你可以发isssue至客服邮箱或根据报错Log自行删减项目文件,其中利弊,自行斟酌。

使用盗版oc会被发现吗

       ä¼šã€‚截止到年月日,使用盗版oc会被发现。盗版是指在未经版权所有人同意或授权的情况下,对其复制的作品、出版物等进行由新制造商制造跟源代码完全一致的复制品、再分发的行为。

如何在swift中实现oc中的分类

       åœ¨swift中没有分类这种写法了。相对应的是swift中只有扩展(Extensions)。

       ä¸‹é¢æ˜¯swift中扩展(Extensions)的说明

       æ‰©å±•å°±æ˜¯å‘一个已有的类、结构体、枚举类型或者协议类型添加新功能(functionality)。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和 Objective-C 中的分类(categories)类似。(不过与 Objective-C 不同的是,Swift 的扩展没有名字。)

       1. æ–°å»ºswift文件

       2.代码实现

       import Foundation

       import UIKit

       //private var PERSON_ID_NUMBER_PROPERTY = 0

       extension UIView {

           public var x: CGFloat{

               get{

                   return self.frame.origin.x

               }

               set{

                   var r = self.frame

                   r.origin.x = newValue

                   self.frame = r

               }

           }

           public var y: CGFloat{

               get{

                   return self.frame.origin.y

               }

               set{

                   var r = self.frame

                   r.origin.y = newValue

                   self.frame = r

               }

           }

           /

       }

       è¯·å‚考这里/swift/.html

OC内存管理-runloop

        RunLoop 是通过内部维护的 事件循环( Event Loop )来对 事件/消息进行管理的一个对象。

        runloop 的官方文档在 thread 篇章 Run Loops ,也就从侧面说明了 runloop 是与线程息息相关的。

        官方有如下一张图:

        线程的输入源:

        线程针对输入源的处理机制:

        有以下案例:

        timer 与 performSelector 对应的回调都是 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ :

        block 对应 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ :

        主线程对应 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ :

        系统触摸事件对应 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ :

        通知事件对应 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ :

        小结:

        滚动页面输出:

        页面滚动过程中处于 UITrackingRunLoopMode ,静止状态处于 kCFRunLoopDefaultMode 。

        输出:

        输出:

        既然 runloop 是一个事件循环,那么它与普通的循环有什么区别呢?

        普通循环:

        runloop 循环:

        那么可以得到以下结论:

        那么 runloop 是怎么做到的呢?

        通常我们会通过 NSRunLoop 去获取当前的 runloop :

        定义如下:

        给 currentRunLoop 下符号断点:

        通过之前的分析已经定位到了 runloop 是在 CoreFoundation 中的 CoreFoundation源码 。正好 CoreFoundation 开源了 CFRunLoop :

        那么核心逻辑就在 CFRunLoopRunSpecific 中。还有一个疑问是 runloop 可以休眠,那么它是如何实现的呢?

        要了解 runloop 的实现原理,首先要清楚它的数据结构。

        CFRunLoopRunSpecific 的第一个参数是 CFRunLoopGetCurrent() :

        _CFRunLoopGet0

        CFRunLoopRef 的定义如下:

        实际上底层它是 __CFRunLoop 类型:

        对于 timer 而言:

        显然它是要依赖 mode 的。

        CFRunLoopMode

        而一个 mode 下又对应多个 items(source0、source1、timers、observers) ,所以就有如下关系:

        既然有多种 mode ,那么都有哪些呢?

        源码中有如下定义:

        它们对应 Foundation 中的:

        我们都清楚在页面滚动的时候有一个 UITrackingRunLoopMode :

        除了以上 3 种 mode 还有两个私有 mode :

        当 RunLoop 运行在 Mode1 上时,是无法接受处理 Mode2 或 Mode3 上的 Source、Timer、Observer 事件的。

        以 timer 为例,将 timer 加入到 runloop 中:

        底层调用了 CFRunLoopAddTimer :

        根据要加入的 mode 区分是 common mode 和非 common mode 将 timer 加入 mode 中。这个时候只是将 timer 加入了 mode 中,要执行肯定要调用 CFRunLoopRun ,最终要调用 CFRunLoopRunSpecific 。

        在 __CFRunLoopRun 中调用了 __CFRunLoopDoTimers :

        找到 mode 中的所有 timer 然后调用 __CFRunLoopDoTimer 。

        CFRunLoopAddTimer -> CFRunLoopRunSpecific -> __CFRunLoopRun -> __CFRunLoopDoTimers -> __CFRunLoopDoTimer -> __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ 。

        与 timer 相同 source 会调用 CFRunLoopAddSource :

        CFRunLoopAddSource -> CFRunLoopRunSpecific -> __CFRunLoopRun -> __CFRunLoopDoSources0/__CFRunLoopDoSources1 -> __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ /__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__

        同理 observer 会调用 CFRunLoopAddObserver 。

更多内容请点击【休闲】专栏

精彩资讯