OC核心语法(二)

一、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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值