Skip to content

Instantly share code, notes, and snippets.

View zhangkn's full-sized avatar
❣️
https://kunnan.blog.csdn.net/

公众号:iOS逆向 zhangkn

❣️
https://kunnan.blog.csdn.net/
View GitHub Profile
@ChiChou
ChiChou / fixheader.sh
Created March 27, 2017 05:56
fix header generated from class-dump
#!/bin/bash
#
# NOTE: You need to `brew install gnu-sed` on Mac
#
# by @codecolorist
# http://github.com/chichou
#
# fix some compilation error of headers generated by class-dump
#
# usage: fixheader.sh DIRECTORY
***************
*** 131,136 ****
--- 131,158 ----
0xFFFFFFF007194BBC, // KSYMBOL_SLEH_SYNC_EPILOG // look for xrefs to "Unsupported Class %u event code."
};
+ uint64_t ksymbols_ipad_mini_2_wifi_15b202[] = {
+ 0xFFFFFFF0074947EC, // KSYMBOL_OSARRAY_GET_META_CLASS,
+ 0xFFFFFFF007523A98, // KSYMBOL_IOUSERCLIENT_GET_META_CLASS
+ 0xFFFFFFF007525240, // KSYMBOL_IOUSERCLIENT_GET_TARGET_AND_TRAP_FOR_INDEX
UIWebClip *clip = [UIWebClip webClipWithIdentifier:nil];
//UIWebClip *clip = [UIWebClip webClipWithURL:[webpage.request.mainDocumentURL absoluteString]];
[clip retain];
[clip setPageURL:webpage.request.mainDocumentURL];
[clip setTitle:[webpage stringByEvaluatingJavaScriptFromString:@"document.title"]];
UIWebDocumentView *docView = nil;
UIScrollView *webpagescroller = [[webpage subviews] objectAtIndex:0];
for (UIView* aView in [webpagescroller subviews]){
if ([aView isKindOfClass:[NSClassFromString(@"UIWebBrowserView") class]]){
docView = (UIWebDocumentView *)aView;
@zhangkn
zhangkn / DynamicMethodResolution.m
Last active May 3, 2018 08:31
Dynamic Method Resolution;动态添加方法:动态添加方法就是在消息转发前在`+ (BOOL)resolveInstanceMethod:(SEL)sel`方法中使用`class_addMethod()` 添加方法。
void dynamicMethodIMP(id self, SEL _cmd) {
// implementation ....
printf("执行了dynamicMethodIMP!!!!");
}
//you can dynamically add it to a class as a method (called resolveThisMethodDynamically) using resolveInstanceMethod: like this:
@implementation MyClass
+ (BOOL)resolveInstanceMethod:(SEL)aSEL
{
if (aSEL == @selector(resolveThisMethodDynamically)) {
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
@zhangkn
zhangkn / Swizzle.m
Last active May 3, 2018 09:27
友盟统计模块的例子,使用Swizzle;---在系统提供的方法上再扩充功能时(不能重写系统方法),就可以使用`Method Swizzling`.
//可以用于日志记录和 Mock 测试。例如上报用户打开的界面所在VC的名称,就可以使用swizzling 统一处理
void Swizzle(Class c, SEL orig, SEL new) {
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))//给一个方法添加新的方法和实现;Adds a new method to a class with a given name and implementation.
//若返回Yes说明类中没有该方法,然后再使用 `class_replaceMethod()` 方法进行取代
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));//取代了对于一个给定类的实现方法
else
//YES if the method was added successfully, otherwise NO (for example, the class already contains a method implementation with that name).
method_exchangeImplementations(origMethod, newMethod);//交换两个类的实现方法
@zhangkn
zhangkn / macdown.sh
Created May 4, 2018 01:46
macdown 打开文档的方式
# 方式一: 使用open
# open -b com.sublimetext.3 ${postName}
# Opens with the specified application bundle identifier. com.uranusjr.macdown
open -b com.uranusjr.macdown ${postName}
# 方式二: 使用 /usr/local/bin/macdown,前提是设置Macdown的terminal属性
devzkndeMacBook-Pro:kunnan.github.io.git devzkn$ macdown _posts/GithubPages/2018-05-04-Github_Pages_Useful_Tool.md
@zhangkn
zhangkn / Serial.m
Created May 4, 2018 06:48
GCD的队列可以分为2大类型:Concurrent\Serial
//0、 GCD的队列可以分为2大类型
// 1)并发队列(Concurrent Dispatch Queue)
可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务);并发功能只有在异步(dispatch_async)函数下才有效
// 2)串行队列(Serial Dispatch Queue)
让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
//1、 容易混淆的术语:有4个术语比较容易混淆:同步、异步、并发、串行
//1) 同步和异步主要影响:能不能开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
@zhangkn
zhangkn / HSSingleton.h
Created May 4, 2018 07:11
单例模式
// 单例模式的作用
可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问;从而方便地控制了实例个数,并节约系统资源
// 单例模式的使用场合
在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)
//1、 单例模式在ARC\MRC环境下的写法有所不同,需要编写2套不同的代码
// 1)可以用宏判断是否为ARC环境
#if __has_feature(objc_arc)
// ARC
#else
@zhangkn
zhangkn / HMAppImageFile.m
Created May 4, 2018 08:08
* 下载图片 *
#define HMAppImageFile(url) [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[url lastPathComponent]]
#import "HMAppsViewController.h"
#import "HMApp.h"
@interface HMAppsViewController ()
/**
* 所有的应用数据
*/
@property (nonatomic, strong) NSMutableArray *apps;
/**
* 存放所有下载操作的队列
@zhangkn
zhangkn / CFRunLoopGetCurrent.m
Last active May 4, 2018 08:20
CFRunLoopGetCurrent
/// 全局的Dictionary,key 是 pthread_t, value 是 CFRunLoopRef
static CFMutableDictionaryRef loopsDic;//线程和 RunLoop 之间是一一对应的,其关系是保存在一个全局的 Dictionary 里
/// 访问 loopsDic 时的锁
static CFSpinLock_t loopsLock;
/// 获取一个 pthread 对应的 RunLoop。
CFRunLoopRef _CFRunLoopGet(pthread_t thread) {
OSSpinLockLock(&loopsLock);
if (!loopsDic) {//线程刚创建时并没有 RunLoop,如果你不主动获取,那它一直都不会有
// 第一次进入时,初始化全局Dic,并先为主线程创建一个 RunLoop。
loopsDic = CFDictionaryCreateMutable();