IOS高階開發~Runtime(一)
一些公用類:
@interface CustomClass : NSObject
- (void) fun1;
@end
@implementation CustomClass
- (void) fun1
{
NSLog(@"fun1");
}
@end
@interface TestClass : NSObject
@end
@implementation TestClass
@end
別忘記引入庫:#include<objc/runtime.h>
1、物件拷貝:id object_copy(id obj, size_t size)
- (void) copyObj
{
CustomClass *obj = [CustomClassnew];
NSLog(@"%p", &obj);
id objTest = object_copy(obj,sizeof(obj));
NSLog(@"%p", &objTest);
[objTest fun1];
}
列印結果:
2013-07-26 15:35:11.547 HighOC[6859:c07] 0xbfffdf64
2013-07-26 15:35:11.547 HighOC[6859:c07] 0xbfffdf60
2013-07-26 15:35:11.547 HighOC[6859:c07] fun1
說明:
object_copy 函式實現了物件的拷貝。2、物件釋放 id object_dispose(id obj)
- (void) objectDispose
{
CustomClass *obj = [CustomClassnew];
object_dispose(obj);
[obj release];
[obj fun1];
}
列印結果:程式crashmalloc: *** error for object 0x758e6d0: pointer being freed was not allocated
3、更改物件的類/獲取物件的類
Class object_setClass(id
Class object_getClass(id obj)
- (void) setClassTest
{
CustomClass *obj = [CustomClassnew];
[obj fun1];
Class aClass =object_setClass(obj, [CustomClassOtherclass]);
//obj 物件的類被更改了 swap the isa to an isa
NSLog(@"aClass:%@",NSStringFromClass(aClass));
NSLog(@"obj class:%@",NSStringFromClass([objclass]));
[obj fun2];
}
- (void) getClassTest
{
CustomClass *obj = [CustomClassnew];
Class aLogClass =object_getClass(obj);
NSLog(@"%@",NSStringFromClass(aLogClass));
}
4、獲取物件的類名constchar *object_getClassName(id obj)
- (void) getClassName
{
CustomClass *obj = [CustomClassnew];
NSString *className = [NSStringstringWithCString:object_getClassName(obj)encoding:NSUTF8StringEncoding];
NSLog(@"className:%@", className);
}
5、給一個類新增方法
BOOL class_addMethod(Class cls,SEL name,IMP imp,
const char *types)
/**
*一個引數
*
*/
int cfunction(id self, SEL _cmd, NSString *str) {
NSLog(@"%@", str);
return10;//隨便返回個值
}
- (void) oneParam {
TestClass *instance = [[TestClassalloc]init];
// 方法新增
class_addMethod([TestClassclass],@selector(ocMethod:), (IMP)cfunction,"[email protected]:@");
if ([instance respondsToSelector:@selector(ocMethod:)]) {
NSLog(@"Yes, instance respondsToSelector:@selector(ocMethod:)");
} else
{
NSLog(@"Sorry");
}
int a = (int)[instanceocMethod:@"我是一個OC的method,C函式實現"];
NSLog(@"a:%d", a);
}
/**
*兩個引數
*
*/
int cfunctionA(id self, SEL _cmd, NSString *str, NSString *str1) {
NSLog(@"%@-%@", str, str1);
return20;//隨便返回個值
}
- (void) twoParam {
TestClass *instance = [[TestClassalloc]init];
class_addMethod([TestClassclass],@selector(ocMethodA::), (IMP)cfunctionA,"[email protected]:@@");
if ([instance respondsToSelector:@selector(ocMethodA::)]) {
NSLog(@"Yes, instance respondsToSelector:@selector(ocMethodA::)");
} else
{
NSLog(@"Sorry");
}
int a = (int)[instanceocMethodA:@"我是一個OC的method,C函式實現" :@"-----我是第二個引數"];
NSLog(@"a:%d", a);
}
相關文件及說明:
Obj-C的方法(method)就是一個至少需要兩個引數(self,_cmd)的C函式
IMP有點類似函式指標,指向具體的Method實現。
向一個類動態新增方法
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
引數說明:
cls:被新增方法的類
name:可以理解為方法名
imp:實現這個方法的函式
types:一個定義該函式返回值型別和引數型別的字串
class_addMethod([TestClass class], @selector(ocMethod:), (IMP)testFunc, "[email protected]:@");
其中types引數為"[email protected]:@“,按順序分別表示:
i:返回值型別int,若是v則表示void
@:引數id(self)
::SEL(_cmd)
@:id(str)
官方文件:
相關推薦
IOS高階開發~Runtime(一)
一些公用類: @interface CustomClass : NSObject - (void) fun1; @end @implementation CustomClass - (void) fun1 { NSLog(@"fun1"); } @en
IOS高階開發~Runtime(四)
原文:http://blog.csdn.net/lizhongfu2013/article/details/9498233 用C代替OC: #import <objc/runtime.h> #import <objc/message
iOS開發之runtime(一):runtime除錯環境搭建
本系列部落格是本人的原始碼閱讀筆記,如果有iOS開發者在看runtime的,歡迎大家多多交流。為了方便討論,本人新建了一個微信群(iOS技術討論群),想要加入的,請新增本人微信:zhujinhui207407,【加我前請備註:ios 】,本人部落格http://www.kyson.cn 也在不停的更新中,歡迎
iOS 應用開發覆盤(一)
從iOS開發轉到Java Web開發有幾年了,最近覆盤一下iOS開發,找一個專案練練手,順便和大家一起分享一下iOS開發的實際操作。對想要做iOS開發的人相信會有一定的幫助。 一、開發環境 iOS開發的話肯定要有蘋果的電腦(黑蘋果有一堆問題,不是很推薦),經濟條件允許的話
IOS 初級開發入門教程(一)介紹篇
導讀 目前移動端開發市場上引導開發者追求技多不壓身,一個全棧開發者至少要懂後臺伺服器、資料庫、Android、web、ios開發等。“一超多強”是指開發者先成為一門技術的專家然後掌握瞭解多門技術,這是一種好的發展趨勢,另外,這種技多不壓身我認為當開發者更適合發
iOS專案開發小技巧(一)--如何自定義UIViewController的titile
專案開發中,我們會碰到自己定義title文字樣式的需求,系統的apiself.title很難對其進行自定義,以前的api有個很複雜的字典屬性可以對其進行修改,這裡不對其進行解釋,我們來看一個簡單的修改其樣式的方法 我們看自己的ViewController.m檔
iOS開發之快取(一):記憶體快取
點選有驚喜 前面一片文章介紹瞭如何上傳和下載檔案,這篇文章將介紹一下如何在iOS裝置中進行快取。 這篇文章將只介紹一下將內容快取到記憶體中,下一篇文章就介紹一下在iOS磁碟上快取內容。 使用快取的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的執行
IOS開發之HomeKit(一)
IOS10中已經自帶了homekit程式。現在由於支援該框架的硬體裝置有限,所以homekit應用還是比較少的,但是由於工作需要,我還是瞭解和學習了一些這方面的知識在這裡還是將這些東西記錄下來,方便以後翻閱,也為剛開始瞭解這方面的小夥伴們提供一些參考。硬體
【轉】如何為Apache JMeter開發插件(一)
選擇 ref 測試結果 沒有 通過 pri for entry state 本文轉載於http://blog.csdn.net/column/details/12925.html,作者:xreztento 作者寫的很精華,我打算在此系列操作一遍後,加多點截圖,便於更多人更快
java_web項目開發經驗總結(一)
從數據 簡單 處理 開發 事務 傳輸 記錄 承載 基礎上 web項目就像一個動態的記事本,功能很強大,你最初的項目功能調研越給力,項目所能發揮的作用也就越給力。這是因為web網絡的強聯系性,大家都可以通過訪問到自己想要訪問的頁面,頁面裏既可以承載信息,也可以承載做事情的
軟件project—思考項目開發那些事(一)
app 爛代碼 fontsize 模式 大型 不明確 極限 後拋 con 閱讀文件夾: 1.背景2.項目管理,質量、度量、進度3.軟件開發是一種設計活動而不是建築活動4.高速開發(簡單的系統結構與復雜的業務模型)5.技術人員的業務理解與產品經理的業務理解的終於業務模型
寵物店app開發界面(一)
ongl and pla androi lis 開發 .com hao123 player aNDROID%E4%B9%8BMEDIapLaYER%E8%AF%A6%E8%A7%A3 http://music.hao123.com/songlist/495630541
Python開發MapReduce系列(一)WordCount Demo
logs 3-9 line counter ota python開發 home num brush 原創,轉發請註明出處。 MapReduce是hadoop這只大象的核心,Hadoop 中,數據處理核心就是 MapReduce 程序設計模型。一個Map/Reduc
thinkphp5框架開發博客(一)
one 下載安裝 git clone 輸出 man frame php bsp 實現 1.ThinkPHP框架下載安裝 php官網:http://www.thinkphp.cn/ 開發手冊:https://www.kancloud.cn/manual/thinkphp5
PHP與Java集成開發詳解(一)
new 編程語言 到你 其中 web-inf request 測試 add 輸入 很久以前,有人從www上看到看到天空上一個很亮的亮點,它就是Java語言,與此同時,在另一個地方一位夢想家也看到了一個亮點,它就是PHP。 時間一天天過去,這兩個亮點也變得越來越亮,很快,它
H5鬥地主×××開發淺談(一)
日誌服務器 登錄 serve server lds 因此 的人 意義 運營 h5鬥地主遊戲開發Q1446595067 官網:h5.haozibbs.com去年從傳統軟件公司辭職,下定決心轉互聯網,由於對遊戲的熱愛,去了一家遊戲公司,待了將近10個月,參與開發了一款動作卡牌手
ArcGIS Engine開發基礎總結(一)
目錄 reader style mov 空間 圖層 不能添加 頁面 制圖 標準Engine功能 地圖瀏覽 地圖制作 數據查詢 數據分析 及 所有的開發控件 —MapControl, PageLayout, Toolbar, TOC, ArcRea
python開發之路(一)
數字 美團 其中 class 翻譯 電視 ... 硬件 算數運算 一、python基礎入門 1、編程語言 程序員與計算機溝通的語言就叫做編程語言 編程語言發展至今經歷了以下: ①.機器語言:站在計算機(奴隸)的角度,說計算機能聽懂的語言,那就是直接用二進制編程,直接操作
嵌入式開發環境搭建(一) 虛擬機實現橋接Ethernet網口 並且通過WIFI進行NAT聯網
war bubuko 搭建服務器 6.4 網線 16.4 聯網 橋接 圖片 背景: 目前手頭上有一塊JZ2440的板子,之前有搭建完整套開發環境,由於虛擬機故障需要從新搭建服務器端,故在此記錄搭建步驟 環境: Ubuntu16.4 VMWare 12 先行條件:
高性能服務器開發基礎系列 (一)主線程與工作線程的分工
c++ 服務器 服務器端為了能流暢處理多個客戶端鏈接,一般在某個線程A裏面accept新的客戶端連接並生成新連接的socket fd,然後將這些新連接的socketfd給另外開的數個工作線程B1、B2、B3、B4,這些工作線程處理這些新連接上的網絡IO事件(即收發數據),同時,還處理系統中的另外一些事