iOS Extension Category Protrol 例子理解
直接上程式碼
先讀懂程式碼才能更好的理解含義。
目錄:
Person類沒有暴漏任何方法:
//
// Person.h
// ExtensionCateGoryProtrolDemo
//
// Created by apple on 2017/12/14.
// Copyright © 2017年 ZY. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Study.h"
@interface Person : NSObject<Study>
@end
//
// Person.m
// ExtensionCateGoryProtrolDemo
//
// Created by apple on 2017/12/14.
// Copyright © 2017年 ZY. All rights reserved.
//
#import "Person.h"
#import <objc/runtime.h>
//這也是類擴充套件
@interface Person ()
@property(nonatomic,assign) int age;
@end
@implementation Person
-(void)logAge{
self.age = 18;
NSLog(@"%d",self.age);
}
-(void)Eat{
NSLog(@"Eat");
}
-(void)Study{
NSLog(@"Study");
}
-(void)setFriendName:(NSString *)name{
objc_setAssociatedObject(self, @"friendName", name,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)friendName{
return objc_getAssociatedObject(self, @"friendName");
}
@end
Category用runtime方法實現了可以設定屬性:
//
// Person+Run.h
// ExtensionCateGoryProtrolDemo
//
// Created by apple on 2017/12/14.
// Copyright © 2017年 ZY. All rights reserved.
//
#import "Person.h"
@interface Person (Run)
@property(nonatomic,strong)NSString * name;
-(void)Run;
@end
//
// Person+Run.m
// ExtensionCateGoryProtrolDemo
//
// Created by apple on 2017/12/14.
// Copyright © 2017年 ZY. All rights reserved.
//
#import "Person+Run.h"
#import <objc/runtime.h>
@implementation Person (Run)
-(void)Run{
NSLog(@"Run");
}
-(void)setName:(NSString *)name{
objc_setAssociatedObject(self, @"name", name,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)name{
return objc_getAssociatedObject(self, @"name");
}
@end
單獨的Extension檔案相當於一個需要自己實現的Category(本例子已經在Person類實現):
//
// Person+Eat.h
// ExtensionCateGoryProtrolDemo
//
// Created by apple on 2017/12/14.
// Copyright © 2017年 ZY. All rights reserved.
//
#import "Person.h"
@interface Person ()
@property(nonatomic,copy)NSString * friendName;
-(void)logAge;
-(void)Eat;
@end
Protocol和Extension一樣需要別人實現,我理解的區別是Extension必須要你擴充套件的類實現,而protocol誰遵守協議誰實現:
//
// Study.h
// ExtensionCateGoryProtrolDemo
//
// Created by apple on 2017/12/14.
// Copyright © 2017年 ZY. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol Study <NSObject>
-(void)Study;
@end
呼叫類:
//
// ViewController.m
// ExtensionCateGoryProtrolDemo
//
// Created by apple on 2017/12/14.
// Copyright © 2017年 ZY. All rights reserved.
//
#import "ViewController.h"
#import "Person+Run.h"
#import "Extension/Person+Eat.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person * Mryang = [Person new];
Mryang.name = @"Mryang";
Mryang.friendName =@"MrsLu";
NSLog(@"%@",Mryang.name);
NSLog(@"%@",Mryang.friendName);
[Mryang logAge];
[Mryang Run];
[Mryang Eat];
[Mryang Study];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
列印結果可想而知。見demo
相關文章
- iOS分類(category)、類擴充套件(extension)、繼承的區別iOSGo套件繼承
- iOS底層原理-CategoryiOSGo
- iOS問題整理03----CategoryiOSGo
- iOS桌面小外掛 Widget ExtensioniOS
- 玩轉iOS開發:iOS 8 新特性《Share Extension》iOS
- 玩轉iOS開發:iOS 10 新特性《Xcode Extension》iOSXCode
- 小例子理解多型多型
- iOS底層原理總結 - Category的本質iOSGo
- iOS 開發:『Runtime』詳解(三)Category 底層原理iOSGo
- Category 特性在 iOS 元件化中的應用與管控GoiOS元件化
- Sqlserver鎖升級的理解和例子SQLServer
- Category探索Go
- iOS中Network Extension安全科學Tunnel應用(Swift5)iOSSwift
- 用一個實際例子理解Dockervolume工作原理Docker
- C語言:一個例子理解 union 和 structC語言Struct
- 小例子 理解 Laravel 中的 控制反轉模式Laravel模式
- App ExtensionAPP
- Tampermonkey & Extension
- 用一個實際例子理解Docker volume工作原理Docker
- iOS底層原理總結 -- 利用Runtime原始碼 分析Category的底層實現iOS原始碼Go
- mysqlalchemy audit extensionMySql
- Hack With Chrome ExtensionChrome
- php mongodb extensionPHPMongoDB
- “理解”iOS記憶體管理iOS記憶體
- 深入理解 iOS Rendering ProcessiOS
- 透過一個具體的例子理解 npm 的 peerDependencyNPM
- Category的本質<一>Go
- Category的實現原理Go
- 探秘Runtime - 深入剖析CategoryGo
- 如何在SAP Spartacus category 頁面裡拿到當前的category資訊Go
- 舉個例子來理解一下Koa的洋蔥模型模型
- 透過現實生活中一個例子來理解 JavaScript PromiseJavaScriptPromise
- App extension 總結APP
- iOS-Widgets小元件-Today Extension和主App之間的簡單資料共享iOS元件APP
- Runtime原始碼 Category(分類)原始碼Go
- SAP MM Purchase Order History CategoryGo
- Hybris做增強的兩種方式:In App Extension和Side by Side ExtensionAPPIDE
- iOS CharacterSet(字符集)簡單理解iOS
- iOS刨根問底-深入理解GCDiOSGC