panda
(panda)
#1
这里问哈调试问题
0)我通常用 NSLog(“xxxxx:%@”); 去打印信息,我只知道 %@ 可以打印 NSString ,id 类型的函数参数
1)不知道怎么打印函数参数是什么,比如 (SEL)selector 我们知道它是一个SEL 类型的对象,但是不知道它到底对应什么
2)
%new
- (BOOL)canPerformAction:(SEL)selector withSender:(id)sender
怎么打印 selector 到底是什么
3)怎么打印类 是否存在 ,类实例的话我们还可以用 实例==nil 来判断是否 实例存在,但类就不行,不知道什么函数来判断
5)知道类对象存在,怎么打印类对象是什么,比如Instagram 引出的问题,执行下面的代码 我程序就挂了
%new
- (BOOL)canPerformAction:(SEL)selector withSender:(id)sender/
{
NSLog(@“canPerformAction selector = %@ withSender = %@”,class_getInstanceMethod([self class],selector),sender);
}
7) 想知道 IMP Class SEL 之间是什么关系啊, class 是一个类,imp 是函数实现,SEL 是函数,怎么互相打印啊
弄清楚这些对于调试有很大帮助
希望大大 不要介意问这么多~_~当然大大知道哪些书介绍到这些可以说一下
1, 2. SEL可以用NSStringFromSelector先转化成NSString,再用%@打印;
3. 不需要判断,直接%@,是nil也没关系;
5. 这是格式不对造成的,用%@去打印int也会崩。你下次注意点,一般就不会出这种问题了;
7. IMP没法打印,SEL已经解释过了,Class用%@打印
4和6呢?
panda
(panda)
#3
先说说为什么要判断,为什么不直接用
我想的是 如果直接用 很可能出现 实例或者参数不存在的情况下,造成崩溃 我却搞不清楚为什么会崩溃
事先就打印出来 很保险!
大大说的 意思是 有些 可以打印 有些不能打印的意思吗???
或者能转换为NSString 的话就可以打印了?
4)问题4 是 函数参数是否存在判断 我觉得是不是直接 arg == nil 就可以判断了
6)比如 CGPoint g; 它已经被初始化了
可以直接这样 NSLog("%@",g); 吗???
我之前是这样打印的:
NSLog(@“longpress_zhong3 %d %d”,(int)(localtion.x),(int)(localtion.y-20));
5) 那么 %@ 表示的到底是什么呢?能打印什么类型呢,我没有找到
比如 %d 我知道是 打印 整形变量 %@ 表示打印什么呢?
6)举个例子
- (instancetype)initWithString:(NSString )aString
怎么打印 函数的地址?
在网上找例子:
void (setter)(id, SEL, BOOL);
int i;
setter = (void()(id, SEL, BOOL))[target methodForSelector:@selector(setFilled:)];
for (i = 0; i < 1000; i++)
setter(targetList, @selector(setFilled:), YES);
setter 是IMP 那么这里想打印 IMP 是对应着什么函数的
pedef struct objc_method *Method;
typedef struct objc_ method {
SEL method_name;
char *method_types;
IMP method_imp;
};
一个方法 Method,其包含一个方法选标 SEL – 表示该方法的名称,一个types – 表示该方法参数的类型,一个 IMP - 指向该方法的具体实现的函数指针。
7)
class_getInstanceMethod([self class],selector) 返回的是Method
Method 能打印吗?IMP 没法打印,是因为 IMP可以理解成函数地址吗?那么怎么打印函数地址呢?*
%@只能打印继承自NSObject类的对象
你要打印函数地址和IMP干嘛?你想做什么?
panda
(panda)
#5
IMP 不是函数地址吗?
目的:想要 获取函数地址 然后调用
做什么:就是想知道函数地址是什么, 而不为空
if(函数地址 != nil)
{
函数地址调用函数
}就像是 windows 编程那样 GetProcAddresss() 得到函数地址 然后调用 但要先验证 函数地址是否正确