Tweak引用头文件出错。

今天在HOOK一个函数的时候 LOG输出参数是这样的:

getMyPurchasedEmotion:(
	    "MDMyEmotionPacketStatusItem 0x176a7590: packetId 1282, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7630: packetId 1211, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7640: packetId 1247, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7650: packetId 1186, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7660: packetId 1191, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a75d0: packetId 1205, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7690: packetId 1138, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a76b0: packetId 1086, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a76c0: packetId 1108, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7710: packetId 1089, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7720: packetId 1135, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7730: packetId 1105, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7740: packetId 1001, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7750: packetId 999, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7760: packetId 1000, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7770: packetId 1126, inuse 1",
	    "MDMyEmotionPacketStatusItem 0x176a7780: packetId 1042, inuse 0",
	    "MDMyEmotionPacketStatusItem 0x176a7670: packetId 1043, inuse 0",
	    "MDMyEmotionPacketStatusItem 0x176a7680: packetId 1067, inuse 0",
	    "MDMyEmotionPacketStatusItem 0x176a7800: packetId 1115, inuse 0",
	    "MDMyEmotionPacketStatusItem 0x176a7810: packetId 1072, inuse 0"
	)

我需要加一点自己需要的数据进去,于是找到MDMyEmotionPacketStatusItem这个头文件:


@class NSString;

@interface MDMyEmotionPacketStatusItem : NSObject
{
    NSString *packetId;
    BOOL inuse;
}

@property(nonatomic) BOOL inuse; // @synthesize inuse;
@property(retain, nonatomic) NSString *packetId; // @synthesize packetId;
- (id)description;
- (void)dealloc;

@end

在XM里面引用头文件

#import "MDMyEmotionPacketStatusItem.h"

然后在hook的方法里面初始化这个参数报错

MDMyEmotionPacketStatusItem *item =[MDMyEmotionPacketStatusItem alloc]init];

错误提示:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_MDMyEmotionPacketStatusItem", referenced from:
      objc-class-ref in DemoChat.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这段错误我在网上查找,说的是有的库文件没引用,但是不清楚是什么没有被引用进去。

你描述的问题跟书上第41页举的例子基本是一模一样的情况,把这部分看懂,你就知道怎么解决你的问题了

书上说的是SpringBoard类的内部增加新函数。我是想在别的类的Hook里面调用MDMyEmotionPacketStatusItem,而不是MDMyEmotionPacketStatusItem这个类本身增加新的函数

你还是没有理解静态和动态的微妙关系。
编译器报的错是,找不到MDMyEmotionPacketStatusItem类的定义,即使你在头文件里声明了,编译器也找不到它的实现,因为它的实现不在一个库里,而在一个可执行文件里,你是没有办法静态导入的,所以必须动态获取这个类,就要用到%c

理解了,%c是动态获取一个类,那么我代码现在这样改 去掉MDMyEmotionPacketStatusItem.h的引用

MDMyEmotionPacketStatusItem* item=%c(MDMyEmotionPacketStatusItem);
[item alloc]init];

item.packetId=@“1282”;
item.inuse=TRUE;
报错: Member access into incomplete type 'MDMyEmotionPacketStatusIte

你这样写相当于是:
NSString *string = NSString;
改成

MDMyEmotionPacketStatusItem *item = %c(MDMyEmotionPacketStatusItem) alloc] init];

解决!感谢老大。
另外.h的引用不能取消。

%c是为了告诉编译器,MDMyEmotionPacketStatusItem这个类我是动态获取的,静态编译时你放我一马;
头文件的作用是告诉编译器,这个类有这些方法可以供我调用,我在代码里调用是没问题的,你别大惊小怪。作用不一样