打开Xcode -> 选择IOS -> Application -> Single View Application -> 然后按next
2.如果你创建了工程那快捷键(com-shift-N) -> 选择IOS -> Application -> Single View Application -> 然后按next
在Xcode 按快捷键com+N 在左面找到iOS子类目下找到Source在右面找到Objective-C File
Next->File Type->Category
在到File->打入文件名字
NSObject+MSObject_Category.h
#import <Foundation/Foundation.h>
//给 NSObject 添加一个类目,即非正式协议
@interface NSObject (MSObject_Category)
-(void)test1;
-(void)test2;
@end
NSObject+MSObject_Category.m
#import "NSObject+MSObject_Category.h"
@implementation NSObject (MSObject_Category)
@end
MyClass.h
#import <Foundation/Foundation.h>
#import "NSObject+MSObject_Category.h"
@interface MyClass : NSObject
@end
MyClass.m
#import "MyClass.h"
#import <objc/runtime.h>
#import "MyClass_MyClass_Extension.h"
#pragma mark -------延展---------
/*
延展
延展的作用就是定义自己的私有方法
形式和类目相同,不必新创建文件,只是把类目的 interface 文件放在你需要扩展的类的.m 文件里
*/
@interface MyClass ()
@property (nonatomic,retain)NSString *property3;
-(void)testExtension;
@end
@implementation MyClass
-(void)test1
{
NSLog(@"test1");
}
-(void)test2
{
NSLog(@"test2");
[self setProperty3:@"Property3"]; //OC 运行时设置延展中的属性的赋值
NSLog(@"%@",self.property3); //OC 运行时设置延展中的属性的输出
[self testExtension];
[self MyClassExtension2];
}
//延展
-(void)testExtension
{
NSLog(@"我是延展:testExtension");
}
//OC 运行时设置延展中的属性
-(void)setProperty3:(NSString *)property3
{
objc_setAssociatedObject(self, @selector(property3), property3, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)property3
{
return objc_getAssociatedObject(self, @selector(property3));
}
-(void)MyClassExtension2
{
NSLog(@"我是延展:MyClassExtension2");
}
@end
在Xcode 按快捷键com+N 在左面找到iOS子类目下找到Source在右面找到Objective-C File
Next->File Type->Extension
Class->写入MyClass
在到File->打入文件名字:MyClass_Extension
MyClass_MyClass_Extension.h
#import "MyClass.h"
@interface MyClass ()
-(void)MyClassExtension2;
@end
ViewController.m
#import "ViewController.h"
#import "MyClass.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/*
非正式协议:由于几乎所有的类都继承 NSObject(其余的继承于 NSProxy),由于 NSObject 的特殊性,所有 NSObject的类目声明称为‘非正式协议’。创建一个 NSObject 的类目而不实现,称为‘创建一个非正式协议’
*/
MyClass *myClass = [MyClass new];
if ([myClass respondsToSelector:@selector(test1)])
{
[myClass test1];
}
if ([myClass respondsToSelector:@selector(test2)])
{
[myClass test2];
}
#pragma mark ---------延展--------------
[myClass setValue:@"Rick" forKey:@"property3"];
if ([myClass respondsToSelector:@selector(test2)]) {
[myClass test2];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
运行结果
2016-01-02 15:03:00.950 OC_LX_09_01[3771:110668] test1
2016-01-02 15:03:00.951 OC_LX_09_01[3771:110668] test2
2016-01-02 15:03:00.951 OC_LX_09_01[3771:110668] Property3
2016-01-02 15:03:00.951 OC_LX_09_01[3771:110668]我是延展:testExtension
2016-01-02 15:03:00.951 OC_LX_09_01[3771:110668]我是延展:MyClassExtension2
2016-01-02 15:03:00.952 OC_LX_09_01[3771:110668] test2
2016-01-02 15:03:00.952 OC_LX_09_01[3771:110668] Property3
2016-01-02 15:03:00.952 OC_LX_09_01[3771:110668]我是延展:testExtension
2016-01-02 15:03:00.953 OC_LX_09_01[3771:110668]我是延展:MyClassExtension2