OC 反射-->動態創建類

来源:https://www.cnblogs.com/EchoHG/archive/2018/02/08/8432752.html
-Advertisement-
Play Games

創建Class 添加成員變數 獲取Class的成員變數名 調用以後,結果為: 創建方法 第一個參數為類名,第二個參數為方法名,第三個參數是函數名,第四個參數是函數的返回值和參數的類型,v表是void,@表示id,:表示SEL。更多多定義參考:SELECTOR 需要實現,這個方法 添加屬性 查看屬性 ...


 

創建Class

 1 - (Class) createNewClass {
 2     const char * className;
 3     className = [@"Student" UTF8String];
 4     Class kclass = objc_getClass(className);
 5     //判斷此類是否已經存在,如果存在則返回,不存在就創建
 6     if (!kclass)
 7     {
 8         Class superClass = [NSObject class];
 9         kclass = objc_allocateClassPair(superClass, className, 0);
10     }
11     return kclass;
12 }

 註冊類

1  Class newClass = [self createNewClass];
2  id instanceObjects = [[newClass alloc] init];
3  NSLog(@"註冊後的類實例化對象:%@", instanceObjects);

列印結果:

 

 


 

 

添加成員變數

1 //添加成員變數
2 - (void) addNewVariable:(Class) newClass {
3     class_addIvar(newClass, "_stuName", sizeof(NSString *), 0, "@");
4 }

 

 

獲取Class的成員變數名

 1 //    獲取類的成員變數名
 2 - (NSArray *)getVariableNamesByObject:(id)object
 3 {
 4     unsigned int numIvars = 0;
 5 //    獲取類的所有成員變數
 6     Ivar * ivars = class_copyIvarList([object class], &numIvars);
 7 //    定義一個數組來接收穫取的屬性名
 8     NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:numIvars];
 9     for(int i = 0; i < numIvars; i++) {
10 //        得到單個的成員變數
11         Ivar thisIvar = ivars[i];
12 //        得到這個成員變數的類型
13         const char *type = ivar_getTypeEncoding(thisIvar);
14         NSString *stringType =  [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
15 //        此處判斷非object-c類型時跳過
16         if (![stringType hasPrefix:@"@"]) {
17             continue;
18         }
19 //        得到成員變數名
20         NSString *variableName = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
21         [nameArray addObject:variableName];
22         
23 //        這個函數可以得到成員變數的值
24 //        object_getIvar(object, thisIvar)
25         
26     }
27     free(ivars);
28     return nameArray;
29 }

 

 

調用以後,結果為:

 


 

 

 

創建方法

第一個參數為類名,第二個參數為方法名,第三個參數是函數名,第四個參數是函數的返回值和參數的類型,v表是void,@表示id,:表示SEL。更多多定義參考:SELECTOR

1    class_addMethod([kclass class], @selector(say:), (IMP)say, "v@:");

 

 

需要實現,這個方法

 

 

 


 

 

添加屬性

1 //添加一個屬性
2 - (void) addProperties:(Class) newClass {
3     NSString *propertyName = @"stuSex";
4     objc_property_attribute_t type = { "T", "@\"NSString\"" };
5     objc_property_attribute_t ownership = { "C", "copy" };
6     objc_property_attribute_t backingivar  = { "V", [propertyName UTF8String]};
7     objc_property_attribute_t attrs[] = { type, ownership, backingivar };
8     BOOL isOk=class_addProperty(newClass, [propertyName UTF8String], attrs, 3);
9 }

 

 

查看屬性

 1 //    獲取類的所有屬性名
 2 - (NSArray*)getPropertieNamesByObject:(id)object
 3 {
 4     
 5     unsigned int outCount, i;
 6     
 7 //    獲取註冊類的屬性列表,第一個參數是類,第二個參數是接收類屬性數目的變數
 8     objc_property_t *properties = class_copyPropertyList([object class], &outCount); 
 9 //    定義一個數組來接收穫取的屬性名
10     NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:outCount];
11     for (i = 0; i < outCount; i++) {
12 //        通過迴圈來獲取單個屬性
13         objc_property_t property = properties[i];
14 //        取得屬性名
15         NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
16 //        將得到的屬性名放入數組中
17         [nameArray addObject:propertyName];
18         
19     }
20     free(properties);
21     return nameArray;
22 }

 

 

列印結果:

 


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 偶爾對比起2016以下的版本(比如ssms2014),ssms2016有一個小地方有區別。就是報錯的行號有區別 舉個例子,下麵同樣的語句在ssms2014和ssms2016裡面運行。就是如下的效果 顯而易見,這裡的行9和 xml 變數的定義都是有問題的。所以ssms2014裡面直接給出 這樣的提示錯 ...
  • 由於 0.10.x 版 Kafka 與 0.8.x 版有很大的變化,這種變化對下游 Storm 有非常大的影響,0.10.x 版的 Kafka 不但增加了許可權管理的功能,而且還將 simple 和 high consumer 的 offsets 進行統一管理,也就意味著在 0.8.x 中 Storm ...
  • 一、事務概述 1.什麼是事務 一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗 就是將n個組成單元放到一個事務中 2.mysql的事務 預設的事務:一條sql語句就是一個事務 預設就開啟事務並提交事務 手動事務: 1)顯示的開啟一個事務:start transaction ...
  • 現象 最近一直收到客戶反饋某個報表數據查詢不出來。 處理過程 將涉及SQL挖出來後研究未發現sql有任何異常,且未找到優化空間,F5查看執行計劃發現耗費巨大,且兩表索引均未生效,但把兩表單獨拿出來查詢索引有效,所以初步認定為索引失效問題。 Oracle 索引的目標是避免全表掃描,提高查詢效率,但有些 ...
  • 分類與協議是Object-C特有概念,分類(Category)可以認為是一種繼承性的擴展,而協議(Protocol)可以理解為Java中的Interface(介面)或者C++的純虛類。 參考資料:《iPhone與iPad開發實戰-iOS經典應用剖析》 分類與協議是Object-C特有概念,分類(Ca ...
  • Android O 上Notification的新特性: 通知通道功能 1. 簡介: 通知通道功能使開發者管理自己應用的通知成為一個組或者一個通道,用戶可以通過通知通道完成設置通知,如:阻止所有通知,改變某個通道通知的優先順序,是不是顯示launch上的小圓點。通過這些方式來提升用戶體驗。 2. 1. ...
  • Github網址:https://github.com/Stars-One/CirclePointMove 這個開源庫一個封裝好的Viewpager指示器,之前在學習的時候,想要實現一個小圓點跟隨Viewpager移動的功能,在github上找了許久,發現大神們的指示器很強大,很逼格,同時,設置也是 ...
  • 尊重勞動成果,轉載請標明出處http://www.cnblogs.com/tangZH/p/8423803.html android滑動組件的scrollBar,看了不是很順眼,沒辦法,因為項目需求,得自定義一個。 1、自定義一個View,繼承HorizontalScrollView 2、根據需求自 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...