Objective-C語言——Extension延展

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







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章