引入 #import
nsobject *object = [[nsobject alloc] init];
nsstring *str = @"runtime新增的變數";
// 新增 屬性
objc_setassociatedobject(object, &fyobjprokey, str, objc_association_copy);
// 獲取 屬性
id objvalue = objc_getassociatedobject(object, &fyobjprokey);
nsstring *getstr = (nsstring *)objvalue;
nslog(@"%@",getstr);
系統類 nsobject,通過 objc_getassociatedobject 這個方法,繫結了乙個新的變數,通過objc_getassociatedobject 這個方法得到 新繫結的變數,稍後再細講這兩個方法,核心就是繫結了乙個變數,通過這個模式我們來把我們一開始的目的實現
下面我們 新建乙個nsobject的類別
#import
@inte***ce
nsobject (fyaddtions)
@property(nonatomic,copy)nsstring *hotelname;
@end
#import "nsobject+fyaddtions.h"
#import
static
void* fyobjprokey = @"fyobjprokey";
@implementation
nsobject (fyaddtions)
-(void)sethotelname:(nsstring *)hotelname
-(nsstring *)hotelname
@end
由於系統類,是不可變的,通過這個方法,就可以變相的給nsobject 新增了乙個屬性
下面我們來嘗試一下:
在新的類裡,引入標頭檔案
nsobject *object = [[nsobject
alloc] init];
object.hotelname = @"哈哈哈";
nslog(@"%@",object.hotelname);
好了目的實現了,下面說說 這兩個方法
1.objc_setassociatedobject(self, &fyobjprokey, hotelname, objc_association_copy);
self 是要給哪個物件新增 變數
&fyobjprokey 是對這個變數的標記,獲得這個變數也是需要這個key值得
hotelname 是 這個 變數的值
objc_association_copy 這個 是新增變數的策略,和屬性的copy類似
一共有 5 個策略
objc_association_assign; //assign策略
objc_association_copy_nonatomic; //copy,nonatomic策略
objc_association_retain_nonatomic; // retain,nonatomic策略
objc_association_retain //retain策略
objc_association_copy //copy策略
2.objc_getassociatedobject(self, &fyobjprokey)
通過 &fyobjprokey 這個標記 獲得 新新增的變數
iOS runtime執行時詳解
記錄一下之前的學習內容 viewcontroller.m中 棧 是高位址往低走 堆是低位址往高走 堆疊溢位 堆和棧 被分配到記憶體區域的兩邊 分別往中間儲存,存滿碰頭就會溢位 這是乙個方法 oc方法的本質 c函式 函式呼叫棧 void viewdidload self viewdidload 會導致...
iOS runtime 執行時 二 深談
attention!逆天的來了 我們在程式設計過程中,如果使用到了runtime 執行時 我們幾乎都是想動態的改變這個類的資訊,包括方法,屬性,balabala的,並且獲得這個類的一些資訊,等等,下面我們就來看看怎麼通過runtime提供的方法,來達到這些目的 1 獲取 這個類的所有屬性 h 檔案 ...
ios Runtime 執行時機制
1.runtime 叫做執行時機制,其實oc也有執行時機制 訊息機制!我們oc中呼叫方法的時候,其實底層就是發訊息。2.c語言中,函式的呼叫在編譯的時候會決定呼叫哪個函式。3.oc當中的函式,屬於動態呼叫的過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在執行的時候才會決定呼叫函式。那麼,現在就可...