Objective-C_语言_类目

ViewController.m

#import "ViewController.h"

#import "Tool.h"

#import "Tool+Tool_Category.h"

#import "MyClass.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    

    //类目 延展协议

#pragma mark ----------类目--------------------

    /*

     类目

     

     定义:为现有的工程的类和系统类添加新的方法

     作用:在类目添加新的方法及属性和在原类中添加方法及属性是一样的,都能够被类和类的种类调用,这样可以快捷

     变量地维护和开发项目。

     

     note :如何在类目中为原类添加新的方法及属性?

     

     

     */

    

    Tool *tool=[Toolnew];

    

    //这是键值访问,即KVC

    [tool setValue:@"Rice"forKey:@"_name"];

    

    [tool setProperty2:@"property2"];

    

    //调用方法

    [tool function1];

    [tool function2];

    

    [tool function3];

    

    NSLog(@"%@",tool.property2);


}


- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end

======================================================================
Tool.h

#import <Foundation/Foundation.h>


@interface Tool : NSObject

{

    NSString *_name;

}

@property (nonatomic,strong)NSString *property2;

//原类的属性

//@property(readwrite,nonatomic,strong)NSString *property1;


//原类中的方法

-(void)function1;



@end

#pragma mark----------------类目-------------------

//在类目中为原类添加新的属性及方法

/*

 类目就是为己存在的类添加新的方法。但是不能添加实例变量

 类目的使用场景

 1.类包含了和多个方法实现,而这些方法需要不同团队的成员来实现

 2.当你在使用继承类库中的类是,你不想继承该类而指向添加一些方法时。

 

 类目能实现上面的需求,当然也有使用类目是需要注意的问题

 1.类目可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建种类来实现

 2.类目可以从在原始类的方法,但是不推荐这样做,这样会覆盖掉原始类的方法,如果确实要重载

 。那就通过继承创建种类来实现

 3.和不同接口有所区别的时,在类目的实现文件中的实例方法只能你不去调用它你不可以

 不用实现声明的所有方法

 */

@interface Tool (ToolCategory)

//{

    //NSString *_property2;//不能添加属性

//}


/*

 在一般情况下,我们是不能向Category添加属性的,只能添加方法,但有些情况下,我们

 确实需要向Category中添加属性,而且系统的API也有一些在Category添加属性

 情况,那么着到底是怎么实现的呢?

 

 IOS运行机制

 ios运行机制,简单来说,就是苹果为开发者提供的一套在运行时动态床架类,属性

 方法的API,他是一套纯C语言的API,使用响应的API就可以通过Category给一个原本存在的类

 添加属性

 

 

 */


@property(nonatomic,strong)NSString *property2;


-(void)function2;


//重载function1

-(void)function1;//在原始类也有function1


@end

=============================================================================
Tool.m

#pragma mark ---------------合成类目中的属性--------------------


-(void)setProperty2:(NSString *)property2

{

    //Property2的设置器

    /*

     id object : 给那个对象的属性赋值

     const void *key :属性对应的key

     id value :设置属性值为value

     <#objc_AssociationPolicy policy#>:使用的策略是一个枚举值。手机开发一般都是选择NONATOMIC

     

     

     如下取值:

     OBJC_ASSOCIATION_ASSIGN = 0, //assign策略

     

    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,//retaincelue

                                          

    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,//copy策略

                                           

    OBJC_ASSOCIATION_RETAIN = 01401,

                                            

    OBJC_ASSOCIATION_COPY = 01403

     

     

     */

    objc_setAssociatedObject(self,@selector(property2), property2,OBJC_ASSOCIATION_COPY_NONATOMIC);

//    objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

}


-(NSString *)property2

{

   //访问器

    returnobjc_getAssociatedObject(self,@selector(property2));

}


-(void)function1

{

    NSLog(@"通过类目重载的function1");//不是输出I am funcation1 而是输出重载后的方法

}



@end

===========================================================================================

在Xcode 按快捷键com+N 在左面找到iOS子类目下找到Source在右面找到Objective-C File 

Next->File Type->Category

在到File->打入文件名字:Tool_Category

Tool+Tool_Category.h

#import "Tool.h"


@interface Tool (Tool_Category)


-(void)function3;


@end

=======================================================================

Tool+Tool_Category.m

#import "Tool+Tool_Category.h"


@implementation Tool (Tool_Category)


-(void)function3

{

    NSLog(@"I'm function3");

}


@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值