OC核心语法(二)

来源:互联网 发布:淘宝代写 举报 编辑:程序博客网 时间:2024/05/01 05:15

一、description方法

1、 -description方法

使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出

2、 +description方法

使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出

3、 修改NSLog的默认输出

       重写-description或者+description方法

例如:

#import <Foundation/Foundation.h>@interface Person : NSObject@property int age;@property NSString *name;@end@implementation Person- (NSString *)description{    //方法的返回值会显示到屏幕上    return [NSString stringWithFormat:@"age=%d,name=%@",_age,_name];}+ (NSString *)description{    return @"wj";}@end#import <Foundation/Foundation.h>#import "Person.h"int main(){    Person *p = [[Person alloc] init];    p.age = 10;    p.name = @"cx";        //如果没有重写description方法,打印的将会是类的地址    //调用的是对象description    NSLog(@"%@",p);    //调用类的description    NSLog(@"%@",[Person description]);        Class c = [Person class];    NSLog(@"%@",c);    return 0;}


4、常犯错误

      如果在-description方法中使用NSLog打印self则会陷入死循环,因为self会调用到本身。

例如:

- (void)description{  NSLog(@"%@",self);}

二、SEL

1、什么是SEL

每个类的方法列表都存储在类对象中,SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法在内存中的地址,找到地址就可以调用该方法了

2、SEL类型的定义

SEL在程序库中的定义如下:

typedef struct objc_selector    *SEL;

所以定义SEL的变量时也不需要跟上“*”

3、SEL对象的创建

SEL s = @selector(test);//直接将已知的方法转为SEL对象SEL s2 = NSSelectorFromString(@"test");//根据方法名转为SEL对象

4、SEL对象的其他用法

// 将SEL对象转为NSString对象NSString *str = NSStringFromSelector(@selector(test));Person *p = [Person new];// 调用对象p的test方法[p performSelector:@selector(test)];

代码示例:

#import <Foundation/Foundation.h>@interface Person : NSObject- (void)test;- (void)test1:(NSString *)name;- (void)test3;@end@implementation Person- (void)test{    //每一个方法中都有一个sel类型的变量_cmd,该变量记录的是该方法的名字    //SEL s = _cmd;    //将SEL类型转为字符串类型    NSString *s = NSStringFromSelector(_cmd);        //NSString *s = [NSString ]    NSLog(@"调用了test方法——————%@",s);}- (void)test1:(NSString *)name{    NSLog(@"调用的是test1方法————%@",name);}- (void)test3{    NSLog(@"test3");}@end#import <Foundation/Foundation.h>#import "Person.h"int main(){    Person *p = [[Person alloc] init];        /**通过方法名字符串调用该方法,不带参数*/    NSString *name = @"test";    // 将该字符串转为SEL类型    SEL s = NSSelectorFromString(name);    //通过SEL类型数据调用该方法    [p performSelector:s];       //间接调用test3    [p performSelector:@selector(test3)];             /**通过方法名字符串调用该方法,带参数*/    //:也是方法名的一部份    NSString *name1 = @"test1:";    //将该字符串转为SEL类型    SEL s1 = NSSelectorFromString(name1);    //通过SEL类型数据调用该方法    [p performSelector:s1 withObject:@"wj"];    return 0;}

三、NSLog输出增强

       __FILE__ :源代码文件名

        __LINE__ :NSLog代码在第几行

        _cmd :代表着当前方法的SEL

会引发死循环的代码:

- (void)test {    [self performSelector:_cmd];}


0 0
原创粉丝点击