本文是我研究了2天最后曲线救国,用文件内的全局变量代替hook代码中自创的成员变量的方法.MSHookIvar只能获取app包中原来就有的成员变量,不能获取自创的成员变量 MSHookIvar的作用 获取类中原有的成员变量,不可以获取自己创建的成员变量格式如下
MSHookIvar<类型>(self,"_成员变量名")
下面的原来的类中有成员变量label1
@property (weak, nonatomic) IBOutlet UILabel *label1;
在获取label1的时候要加上下滑线,因为oc文件编译的时候转换成c++文件,会把成员变量前面添加下滑线_
所以获取的时候要加上下滑线
UILabel *label1 = MSHookIvar<UILabel*>(self,"_label1");//
label1.text = @"hook成了123";
注意:不可以获取到自己在tweak里创建的成员变量
下面代码编译通过,但是运行会闪退
因为MSHookIvar不能获取自己新建的成员变量,只能获取到之前app包里面已经写好的成员变量
#import <UIKit/UIKit.h>
@interface ViewController:UIViewController //为了使用self
@property (nonatomic)__strong UIView *_m_v;
@end
%hook ViewController
- (void)viewDidAppear:(BOOL)animated{
%orig;
UILabel *label1 = MSHookIvar<UILabel*>(self,"_label1");//MSHookIvar<类型>(self,"_成员变量名"),可以获取原来程序里的成员变量,但是不可以获取到自己在tweak里创建的成员变量
label1.text = @"hook成了123";
UIView * testV = MSHookIvar<UIView*>(self,"_m_v");//这行testV没有被赋值,因为没获取到_m_v
testV = [[UIView alloc]initWithFrame:CGRectMake(20, 100, 200 , 200)];//运行到这行闪退,因为testV没有获取
testV.backgroundColor = [UIColor redColor];//这行不能删掉,否则编译报错testV没有被使用
}
}
%end
代替方法在hook中使用自创的成员变量
目前还不能使用自创的成员变量,但是可以用下面方法代替
static是文件内全局变量
例如:
#import <UIKit/UIKit.h>
@interface ViewController:UIViewController //为了使用self
@end
static UIView *v1;//自定义一个文件内的全局变量,可以在不同函数中传递和保存数据
%hook ViewController
- (void)viewDidAppear:(BOOL)animated{
%orig;
v1 = [[UIView alloc]initWithFrame:CGRectMake(20, 100, 200 , 200)];
testV.backgroundColor = [UIColor redColor];
}
}
%end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)