打開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