首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏程序员叨叨叨

    6.5 Swizzle 操作符

    6.5 Swizzle 操作符 可以使用Cg语言中的swizzle操作符(.)将一个向量的成员取出组成一个新的向量。swizzle操作符被GPU硬件高效支持。 swizzle操作符后接x、y、z、w,分别表示原始向量的第一个、第二个、第三个、第四个元素;swizzle操作符后接 r、g、b和a的含义与前者等同。 不过为了程序的易读性,建议对于表示颜色值的向量,使用swizzle操作符后接r、g、b和a的方式。 .w 等价于 float d 值得注意的是,Cg语言中float a 和float1 a是基本等价的,两者可以进行类型转换;float、bool、half等基本类型声明的变量也可以使用swizzle 例如: float a = 1.0; float4 b = a.xxxx; 注意:swizzle操作符只能对结构体和向量使用,不能对数组使用,如果对数组使用swizzle操作符则会出现错误信息:error

    1.4K50发布于 2018-09-26
  • 来自专栏每日一篇技术文章

    Swift3.0 - 黑魔法swizzle

    originalSelector = #selector(UIButton.sendAction(_:to:for:)) let swizzleSelector = #selector(UIButton.swizzle_sendAction return false }() } // 这里必须执行一下,不然没法创建静态变量 T.x } // 定义要交换的函数 public func swizzle_sendAction 看似好像调用了自己构成死循环,但是 我们其实已经将两个方法名的实现进行了调换 所以 其实我们调用的是 方法sendAction:to:forEvent 的实现 这样就可以在不破环原先方法结构的基础上进行交换实现 swizzle_sendAction

    45210发布于 2018-09-14
  • 来自专栏Molier的小站

    记一次 Runtime Hook 的问题

    self changeOrginalSelectorName:@"hookedMethod" inClass:@"RootViewController" withCustomSelectorName:@"swizzle_hookedMethod1 self changeOrginalSelectorName:@"hookedMethod" inClass:@"RootViewController" withCustomSelectorName:@"swizzle_hookedMethod2 { NSLog(@"1"); [self swizzle_hookedMethod1]; } - (void)swizzle_hookedMethod2 { NSLog(@" 2"); [self swizzle_hookedMethod2]; } 然后看下没有 hook 之前的样子 然后我们执行代码 //第一步:交换A中的方法和系统方法 [self changeOrginalSelectorName :@"hookedMethod" inClass:@"RootViewController" withCustomSelectorName:@"swizzle_hookedMethod1" isClassMethod

    38510编辑于 2022-11-03
  • 来自专栏Web行业观察

    Swizzling in GLSL

    5.0); // Sets the 3rd component of someVec to 3.0 and the 1st component to 5.0However, when you use a swizzle as a way of setting component values, you cannot use the same swizzle component twice. So someVec.xx = vec2(4.0, 4.0); is not allowed.Additionally, there are 3 sets of swizzle masks. You cannot combine names from different sets in a single swizzle operation. So ".xrs" is not a valid swizzle mask.In OpenGL 4.2 or ARB_shading_language_420pack, scalars can be swizzled

    16410编辑于 2025-09-16
  • 来自专栏iOS开发

    iOS开发之 Method Swizzling 深入浅出

    如果多次调用了[super load],可能会出现“Swizzle无效”的假象,原理见下图: [dos2ufzkl1.png] Swift 自定义类中使用 Method Swizzling 要在 Swift 自定义类中使用 Method Swizzling 有两个必要条件: 包含 Swizzle 方法的类需要继承自 NSObject 需要 Swizzle 的方法必须有动态属性(dynamic attribute ) 注:对于 Swift 的自定义类,因为默认并没有使用 Objective-C 运行时,因此也没有动态派发的方法列表,所以如果要 Swizzle 的是 Swift 类型的方法的话,是需要将原方法和替换方法都加上 接下来执行 Swizzle 最好的地方就是 initialize了,这是调用第一个方法前的地方。 因为 Swizzling 会改变全局状态,所以我们需要在运行时采取一些预防措施。 apm.netease.com/ 国内网易 国外资料 http://nshipster.com/method-swizzling/ https://medium.com/rocknnull/ios-to-swizzle-or-not-to-swizzle-f8b0ed4a1ce6

    2.7K70发布于 2018-04-24
  • 来自专栏iOS 备忘录

    iOS界面黑白实现

    实现: #import "WKWebView+Swizzle.h" @implementation WKWebView (Swizzle)- (void)load { Class class = "#import "UIImage+Category.h"@implementation UIImageView (Swizzle)+ (void)load { Class class = [self 所有颜色的设置,最终都会走UIColor的colorWithRed:green:blue:alpha:,所以通过hook这个方法,生成灰色的颜色返回并显示,代码如下: #import "UIColor+Swizzle.h " @implementation UIColor (Swizzle) + (void)load { Class class = [self class]; SEL originalSelector = @selector(colorWithRed:green:blue:alpha:); SEL swizzleSelector = @selector(swizzle_colorWithRed

    1.9K40编辑于 2022-12-12
  • 来自专栏hml_知识记录

    使用动态SQL(六)

    使用动态SQL(六)用%ObjectSelectMode = 1 Swizzling字段名称属性下面的示例使用%ObjectSelectMode = 1进行准备,当使用字段名称属性返回值时,其类型类别为可Swizzle 类型的字段(持久性类,序列类或流类)将自动发生Swizzle。 在此示例中,rset.Home处于Swizzle状态,而引用同一字段的rset. 要确定SWIZZLE失败的原因,请在<SWIZZLE FAIL>错误之后立即在%objlasterror中查找并解码此%Status值。默认情况下,未配置<SWIZZLE FAIL>。 在此屏幕上,可以设置<SWIZZLE FAIL>选项。%Get("fieldname")方法可以使用%Get(“ fieldname”)实例方法按字段名称或字段名称别名返回数据值。

    73140编辑于 2022-06-07
  • 来自专栏王大锤

    iOS11UINavigationBar的item左右间距调整

    items];     } else {         [self mk_setRightBarButtonItems:rightBarButtonItems];     } }   + (void)mk_swizzle (self, bSelector);          method_exchangeImplementations(m1, m2); }   + (void)load {     [self mk_swizzle :@selector(setLeftBarButtonItem:)];     [self mk_swizzle:@selector(setLeftBarButtonItems:)];     [self mk_swizzle:@selector(setRightBarButtonItem:)];     [self mk_swizzle:@selector(setRightBarButtonItems

    3.6K50发布于 2018-05-17
  • 来自专栏王大锤

    iOS11UINavigationBar的item左右间距调整

    items];     } else {         [self mk_setRightBarButtonItems:rightBarButtonItems];     } }   + (void)mk_swizzle (self, bSelector);          method_exchangeImplementations(m1, m2); }   + (void)load {     [self mk_swizzle :@selector(setLeftBarButtonItem:)];     [self mk_swizzle:@selector(setLeftBarButtonItems:)];     [self mk_swizzle:@selector(setRightBarButtonItem:)];     [self mk_swizzle:@selector(setRightBarButtonItems

    1.9K30发布于 2018-07-04
  • 来自专栏一“技”之长

    iOS运行时函数替换框架——RSSwizzle

    RSSwizzleInfo *swizzleInfo) { return ^(__unsafe_unretained id self){ NSLog(@"Class log Swizzle return ^(__unsafe_unretained id self,NSSet* touches,UIEvent* event){ NSLog(@"text Swizzle RSSWReturnType(void), RSSWArguments(NSSet* touchs,UIEvent * event), RSSWReplacement({ NSLog(@"test Swizzle

    1.9K30发布于 2018-08-15
  • 来自专栏iOS逆向与安全

    iOS 小技能:Method Swizzling (交换方法的IMP)

    #import "NSObject+Swizzle.h" #include "objc/runtime.h" BOOL class_swizzleMethodAndStore(Class class, = NULL); } @implementation NSObject (Swizzle) + (BOOL)swizzle:(SEL)original with:(IMP)replacement 1.3 Method swizzling的时机 如果使用恰当,Method swizzling 还是很安全的,一个简单安全的方法是,仅在load中swizzle ,在 dispatch_once 中完成 ps :initialize 会在类第一次接收到消息的时候调用 有继承关系的对象swizzle时,先从父对象开始。这样才能保证子类方法拿到父类中的被swizzle的实现。 因此在+(void)load中swizzle不会出错,就是因为load类方法会默认从父类开始调用。

    2.2K10编辑于 2022-08-22
  • 来自专栏iOS逆向

    iOS&mac OS中hook框架的梳理

    Objective-C函数的hook 原理:MSHookMessageEx对于ObjC函数采用的也是method swizzle的方法,主要是Objetive-C的runtime机制,可以在ObjC方法时动态采用 rebind_symbols((struct rebinding[1]){{"NSLog", new_NSLog, (void *)&orig_NSLog}}, 1); } 0x04 method swizzle method swizzle的原理主要是Objetive-C的runtime机制,可以在ObjC方法时动态采用class_replaceMethod等runtime函数替换其实现。 话不多说,直接上一个hook viewWillAppear方法的例子 #import <objc/runtime.h> @implementation UIViewController (Swizzle

    6.7K2516发布于 2018-09-16
  • 来自专栏QQ音乐技术团队的专栏

    iOS类簇代码保护引发的Crash原因排查全记录

    根据这个方向,我们只需要修改一下 K 歌本地的 swizzle 方法名,增加一个业务前缀,避免被第三方 SDK 调用到就行了。尝试了一下,APP 启动后确实不闪退了,本文完结撒花! 三、 问题真正的原因 虽然启动闪退的问题解决了,但方法 swizzle 不应该引发最终的循环调用,最多应该是多走了两个防御性代码,所以这里应该有更深层次的问题没有被发现。 ,则是对 __NSCFString 进行 swizzle。 ,从而导致 Swizzle 失败,所以这里 K 歌更进一步的对子类进行了 MethodSwizzle,看上去是无可厚非的。 如果确实要对系统类做代码防护,需要额外的关注这个类是否是类簇,其具体实现的子类是否包含了想要做 MethodSwizzle 的方法,是否适合 swizzle,从而避免类似的问题。

    58810编辑于 2023-12-23
  • 来自专栏正则

    HOOK原理

    iOS中HOOK技术的几种方式 Method Swizzle:主要用于OC方法,利用OC的Runtime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的,这种技术在之前的 当然它并不是仅仅针对iOS而设计的,安卓一样可以使用,官方地址 Method Swizzle 利用OC的Runtime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的 Method Swizzle技术就是通过runtime提供的函数修改SEL和IMP的对应关系 Cydia Substrate Cydia Substrate主要由3部分组成: MobileHooker HOOK常用的三种方式 Method Swizzle,利用OC运行时特性,修改SEL和IMP的对应关系。 fishHook,HOOK外部符号常用的方式,修改变符号和地址的对应关系。

    1.5K20发布于 2021-10-28
  • 来自专栏iOS逆向与安全

    iOS小技能: 解决UITableViewCell兼容问题(iOS14适配)

    UITableViewCell+CRMaddSubView.h" @implementation UITableViewCell (CRMaddSubView) + (void)load { // Swizzle addSubView UITableViewCellContentView [self kunnan_addSubview:view];//实现方法,因为已经进行了 swizzle implementation UITableViewCell (CRMaddSubView) + (void)load { // return; // Swizzle BOOL)sensorsdata_swizzleMethod:(SEL)originalSEL withMethod:(SEL)alternateSEL; /** 方式二 */ + (BOOL)swizzle method_exchangeImplementations(originalMethod, alternateMethod); // 返回 YES,表示 Swizzling 成功 return YES; } + (BOOL)swizzle

    1.9K30编辑于 2022-08-22
  • 来自专栏大模型快速上手实践

    CATLASS Tiling 模板化设计在算子开发中的应用

    任务分配(Swizzle 调度):CATLASS 使用 Swizzle 策略来决定将哪些 tile 分配给哪个核心计算。。 以 C 矩阵的 M×N 方向划分的基本块为单位,Swizzle 策略按照一定规则编号这些块并映射到硬件的多个核心上并行执行。 比如 BasicMatmul 默认采用 <3,0> 的 swizzle(GemmIdentityBlockSwizzle<3,0>),这代表一种特定的遍历顺序。 例如,在一个案例中,使用 swizzle <3,1> 导致某些核心承担了多于其他核心的 tile 数,负载不均;而改用 <4,1> 后,各核心分工更加均衡,性能从 40.6µs 提升到 35.3µs。 主要包括 BlockMmad(矩阵乘累加模块)、BlockScheduler(如前述 Swizzle)、以及一些可选的 BlockEpilogue(后处理,如无则省略)。

    34970编辑于 2026-01-06
  • 来自专栏UNHub Docs

    Docusaurus v3+ 集成 Giscus 评论系统实战:打造基于 GitHub Discussions 的文档评论区

    process.env.GISCUS_REPO_ID, // 推荐用环境变量 category: 'Docs Comments', categoryId: process.env.GISCUS_CATEGORY_ID, }}Swizzle DocItem 布局,插入评论区:npm run swizzle @docusaurus/theme-classic DocItem/Layout -- --eject 然后在 src/theme

    30910编辑于 2025-10-04
  • 来自专栏高科技宣传

    iOS Crash不崩溃

    2.4 针对野指针的处理机制 模仿Xcode的zombie机制: 1.Swizzle原有allocWithZone方法,添加野指针防护标记。 2.Swizzle原有dealloc方法,如果有野指针防护标记,调用 objc_destructInstance方法,修改实例isa使其指向zombieObject,保存原始 类名,以便上报使用。 3.Swizzle消息转发机制forwardingTargetForSelector方法,处理所 有原始类originObject的方法,收集错误信息并上报。 4.及时释放zombieObject。

    2.9K20编辑于 2022-11-07
  • 来自专栏编程之旅

    iOS开发——Debug CUICatalog: Invalid asset name supplied: (null)

    一开始想到的是用Method Swizzle来修改[UIImage imageNamed:]的实现, 在name为nil的时候用断言, 查看调用栈. 但是想想写了debug之后还得删掉, 比较麻烦.

    3K30发布于 2018-08-30
  • 来自专栏iOS开发干货分享

    iOS面向切面的TableView-AOPTableView

    [self.origViewClass isSubclassOfClass:aopClass]) { // isa-swizzle: 设置TableView的isa指针为创建的TableView 子类 [self bindingFeedsView:feedsView aopClass:aopClass]; } } /** isa-swizzle: 设置TableView 的isa指针为创建的TableView子类 这里需要注意的是KVO使用的也是isa-swizzle,设置了isa-swizzle之后需要把设置的KVO重新添加回去 */ - (void)bindingFeedsView

    1.3K00发布于 2019-05-11
领券