调试时打印关键信息问题总结

这里问哈调试问题
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呢?

先说说为什么要判断,为什么不直接用
我想的是 如果直接用 很可能出现 实例或者参数不存在的情况下,造成崩溃 我却搞不清楚为什么会崩溃
事先就打印出来 很保险!

大大说的 意思是 有些 可以打印 有些不能打印的意思吗???
或者能转换为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干嘛?你想做什么?

IMP 不是函数地址吗?

目的:想要 获取函数地址 然后调用
做什么:就是想知道函数地址是什么, 而不为空
if(函数地址 != nil)
{
函数地址调用函数
}就像是 windows 编程那样 GetProcAddresss() 得到函数地址 然后调用 但要先验证 函数地址是否正确