OC学习笔记六---OC特有语法二


一、Category分类

OC中,对一个类扩充除了使用继承,还有一种方法是使用Category。分类其实就是在类的声明和实现后面增加一个括号,括号里写上分类名称。

@interface 类名 (分类名称)
// 方法声明
@end


 分类的创建方法:

右击项目,选择New File,选择第二项Object-C Category,在Category里输入分类的名字,在Category on里输入在哪个类上创建分类。

 



 

Category的好处是可以将一个很大的类分模块或者分工编写,使得这个类的结构更清晰。Category还可以用于给系统函数添加类方法和对象方法。

使用Category的时候要注意:

1Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类

2Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法

3)多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效

 

二、description方法

使用NSLog%@输出类和对象时,会调用类和对象的+description方法和-description方法。这个方法相当于Java语言中的toString方法,

新建一个Person类,直接打印出对象。

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc] init];
    p.age = 20;
    p.name = @"alin";
    NSLog(@"%@", p);
    return 0;
}


 

可以看到打印出了类名和对象的内存地址,这就是打印对象默认的格式。

那如何输出类的属性和值呢?

我们在Person.m中重写- description方法

#import "Person.h"
 
@implementation Person
- (NSString *)description
{
    return [NSString stringWithFormat:@"名字:%@,年龄:%d", _name, _age];
}
@end


 

 

三、SEL

SEL是一种数据类型。

OC调用方法时,并不是直接在类中根据方法名来找。而是把方法名包装成SEL类型的数据,根据SEL找到对应的方法地址,最后根据方法地址调用方法。

使用[p performSelector:@selector(test1)];可以执行test1方法。

@selector将方法名test1包装成SEL类型。

performSelector传入SEL类型的数据执行方法。

带参数的SEL

[p performSelector:@selector(test2:) withObject:@"我是参数"];

Person.h

#import <Foundation/Foundation.h>
 
@interface Person : NSObject
- (void)test1;
- (void)test2:(NSString *)str;
@end

Person.m

#import "Person.h"
 
@implementation Person
- (void)test1
{
    NSLog(@"----test1");
}
- (void)test2:(NSString *)str
{
    NSLog(@"test3-----%@",str);
}
@end


main.m

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
    Person *p = [Person new];
    [p performSelector:@selector(test1)];
    [p performSelector:@selector(test2:) withObject:@"我是参数"];
}

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值