使用執行時機制向Category中新增屬性

2021-07-26 21:06:52 字數 2515 閱讀 6785

簡明扼要 

了解oc的都應該知道,在一般情況下,我們是不能向category中新增屬性的,只能新增方法,但有些情況向,我們確實需要向category中新增屬性,而且很多系統的api也有一些在category新增屬性的情況,例如我們屬性的uitableviewsectionrow屬性,就是定義在乙個名為nsindexpath的分類裡的,如下 

那這到底是怎麼實現的呢?

ios執行時機制,簡單來說,就是蘋果給開發這提供的一套在執行時動態建立類、新增屬性/方法(不止這些,還有一些其他功能)的api,它是一套純c語言的api,使用相應的api就可以通過category給乙個原本存在的類新增屬性。

#import

#import

@inte***ce

nsobject (categorywithproperty)

/** * 要在category中擴充套件的屬性 */

@property (nonatomic,strong)nsobject *property;

@end

@implementation

nsobject (

categorywithproperty)

- (nsobject *)property

- (void)setproperty:(nsobject *)value

@end

這樣就可以在category中新增屬性了。

原先類的屬性不夠用。新增乙個屬性,呼叫的時候崩潰了,說是找不到getter、setter方法。oc的分類允許給分類新增屬性,但不會自動生成getter、setter方法。有沒有解決方案呢?有,通過執行時建立關聯引用。接下來以新增乙個這樣的屬性為例:

@property (nonatomic, copy) nsstring *str;
1、引入執行時標頭檔案。

#import 

2、在匿名分類或者標頭檔案中新增屬性。區別是:匿名分類中新增的是私有屬性,只在本類中可以使用,類的例項中不可以使用。標頭檔案中新增的在類的例項中也可以使用。

//分類的標頭檔案

@inte***ce

classname (categoryname)

//我要新增乙個例項也可以訪問的變數所以就寫在這裡了

@property (nonatomic, strong) nsstring *str;

@end

//匿名分類

@inte***ce

classname ()

@end

3、在實現裡面寫要新增屬性的getter、setter方法。

@implementation

classname (categoryname)

-(void)setstr:(nsstring *)str

-(nsstring *)str

@end

setstr:方法中使用了乙個objc_setassociatedobject的方法,這個方法有四個引數,分別是:源物件,關聯時的用來標記是哪乙個屬性的key(因為你可能要新增很多屬性),關聯的物件和乙個關聯策略。

用來標記是哪乙個屬性的key常見有三種寫法,但**效果是一樣的,如下:

//利用靜態變數位址唯一不變的特性

1、static

void *strkey = &strkey;

2、static nsstring *strkey = @"strkey";

3、static

char strkey;

關聯策略是個列舉值,解釋如下:

enum ;
4、完成後的整體**如下:

.h檔案

//分類的標頭檔案

@inte***ce

classname (categoryname)

@property (nonatomic, strong) nsstring *str;

@end

.m檔案

//實現檔案

#import "classname + categoryname.h"

#import

static

void *strkey = &strkey;

@implementation

classname (categoryname)

-(void)setstr:(nsstring *)str

-(nsstring *)str

@end

runtime 執行時機制

首先,第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?這個問題我就不跟大家繞彎子了,直接告訴大家,runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了runtime的c語言 r...

runtime 執行時機制

必備常識 1.ivar 成員變數 2.method 成員方法相關應用 1.nscoding 歸檔和解檔,利用runtime遍歷模型物件的所有屬性 2.字典 模型 利用runtime遍歷模型物件的所有屬性,根據屬性名從字典中取出對應的值,設定到模型的屬性上 3.kvo 利用runtime動態產生乙個類...

runtime 執行時機制

runtime 執行時機制 一 runtime是什麼 1 runtime是乙個全動態語言,是基於c語言的庫,裡面包含了很多底層的c語言函式。2 平時編寫的oc 在程式執行過程中,其實最終都是轉成了runtime的c語言 runtime算是oc方法的底層實現,換句話說oc的實現也就是runtime的底...