欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

IOS 中runtime使用方法整理

 更新時間:2017年03月30日 10:00:25   作者:Mr_yong  
這篇文章主要介紹了IOS 中runtime使用方法整理的相關資料,需要的朋友可以參考下

IOS 中runtime使用方法整理

做iOS的朋友都知道或聽說runtime,這個東西很像java的反射機制,但功能遠勝于java的反射。通過runtime我們可以動態(tài)的向一個類中添加屬性、成員變量、方法,以及對其進行讀寫訪問。

新建兩個類ClassOne和ClassTwo

#import <Foundation/Foundation.h>

@interface ClassOne : NSObject{
  NSString *_publicVar1;
  NSString *_publicVar2;
}

@property(nonatomic,copy) NSString *publicProperty1;
@property(nonatomic,copy) NSString *publicProperty2;

- (void) testClassOneWithArg1:(NSString *)arg1;
@end


#import "ClassOne.h"

@interface ClassOne()
@property(nonatomic,copy) NSString *privateProperty1;
@property(nonatomic,copy) NSString *privateProperty2;

@end

@implementation ClassOne{
    NSString *_privateVar1;
    NSString *_privateVar2;
}

- (void)testClassOneWithArg1:(NSString *)arg1{
  NSLog(@"this is CalssOne, arg1:%@",arg1);
}

- (void)testClassOneWithArg1:(NSString *)arg1 arg2:arg2{
  NSLog(@"this is CalssOne, arg1:%@ arg2:%@",arg1,arg2);
}
@end

#import <Foundation/Foundation.h>

@interface ClassTwo : NSObject
- (void) testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2;
@end


#import "ClassTwo.h"

@implementation ClassTwo
- (void)testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2{
  NSLog(@"this is ClassTwo arg1:%@,arg2:%@",arg1,arg2);
}
@end

1.拷貝對象

ClassOne *one = [ClassOne new];
id onec1 = object_copy(one,sizeof(one));

2.給類添加方法

ClassOne *one = [ClassOne new];
class_addMethod([ClassOne class], @selector(testClassOneWithArg1:arg2:arg3:), (IMP)testClassOne , "i@:@@@");
[one testClassOneWithArg1:@"arg1" arg2:@"arg2" arg3:@"arg3"];

//方法對應的C函數(shù)
int testClassOne(id self,SEL _cmd, NSString *arg1,NSString *arg2,NSString *arg3){
NSLog(@"this is a test function add to ClassOne as a methad with arg1:%@ arg2:%@ and arg3:%@",arg1,arg2,arg3);
  return 10;
}

3.添加屬性(方式一)

//屬性類型
objc_property_attribute_t type = { "T", "@\"NSString\"" };
//訪問類型
objc_property_attribute_t ownership = { "C", "" };
//對應成員變量名稱
objc_property_attribute_t backingivar = { "V", "_testPropertyName" };
objc_property_attribute_t attrs[] = { type, ownership, backingivar };
class_addProperty([ClassOne class], "testPropertyName", attrs, 3);
class_addMethod([ClassOne class], @selector(testPropertyName), (IMP)testPropertyNameGetter , "@:@@");
class_addMethod([ClassOne class], @selector(setTestPropertyName:), (IMP)testPropertyNameSetter, "v:@@@");


//屬性對應的Getter方法
NSString* testPropertyNameGetter(id self,SEL _cmd){
  Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName");
  return object_getIvar(self, ivar);
}

//屬性對應的Setter方法
void testPropertyNameSetter(id self,SEL _cmd,NSString *testPropertyNameValue){
  Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName");
  object_setIvar(self, ivar, testPropertyNameValue);
}

4.添加屬性(方式2)

ClassOne *one = [ClassOne new];
objc_setAssociatedObject(one, "objTag", @"value", OBJC_ASSOCIATION_COPY);
NSString *value = objc_getAssociatedObject(one, "objTag");
NSLog(@"通過Associate設置:%@",value);

5.獲取類的名稱

ClassOne *one = [ClassOne new];
const char *className = object_getClassName(one);
NSLog(@"className:%@",[NSString stringWithUTF8String:className]);

6.獲取一個類的所有方法

UInt count;
Method *methods = class_copyMethodList([ClassOne class], &count);
for (int i = 0; i < count; i++) {
  Method method = methods[i];
  SEL sel = method_getName(method);
  NSLog(@"方法名:%@",NSStringFromSelector(sel));
}

7.獲取一個類的所有屬性

uint propertyCount;
objc_property_t *ps = class_copyPropertyList([ClassOne class], &propertyCount);
for (uint i = 0; i < propertyCount; i++) {
  objc_property_t property = ps[i];
  const char *propertyName = property_getName(property);
  const char *propertyAttributes = property_getAttributes(property);
  NSLog(@"propertyName:%@",[NSString stringWithUTF8String:propertyName]);
  NSLog(@"propertyAttributes:%@",[NSString stringWithUTF8String:propertyAttributes]);
}

8.獲取類的所有成員變量

uint ivarCount;
Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount);
for (uint i = 0; i < ivarCount; i++) {
  Ivar ivar = ivars[i];
  const char *ivarName = ivar_getName(ivar);
  NSLog(@"ivarName:%@",[NSString stringWithUTF8String:ivarName]);
}

9.獲得成員變量類型

uint ivarCount;
Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount);
for (uint i = 0; i < ivarCount; i++) {
  Ivar ivar = ivars[i];
  const char *ivarName = ivar_getName(ivar);
  const char *type = ivar_getTypeEncoding(ivar);
  NSLog(@"ivarName=%@,type=%@",[NSString stringWithUTF8String:ivarName],[NSString stringWithUTF8String:type]);
}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • iOS超出父控件范圍無法點擊問題解決

    iOS超出父控件范圍無法點擊問題解決

    這篇文章主要介紹了iOS超出父控件范圍無法點擊問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • iOS實現(xiàn)簡易的計算器

    iOS實現(xiàn)簡易的計算器

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)簡易的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • IOS獲取緩存文件的大小并清除緩存文件的方法

    IOS獲取緩存文件的大小并清除緩存文件的方法

    今天通過本文給大家介紹的離線緩存的功能實現(xiàn),主要分為緩存文件大小的獲取、清除緩存文件的實現(xiàn)。本文給大家介紹的非常詳細,具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10
  • iOS開發(fā)之Quartz2D的介紹與使用詳解

    iOS開發(fā)之Quartz2D的介紹與使用詳解

    什么是Quartz2D?Quartz 2D是一個二維繪圖引擎,同時支持iOS和Mac系統(tǒng)。下面這篇文章主要介紹了iOS開發(fā)之Quartz2D的介紹與使用的相關資料,需要的朋友可以參考下
    2017-03-03
  • iOS10推送教程詳解

    iOS10推送教程詳解

    這篇文章主要為大家詳細介紹了iOS10推送開發(fā)教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • IOS應用內(nèi)跳轉(zhuǎn)系統(tǒng)設置相關界面的方法

    IOS應用內(nèi)跳轉(zhuǎn)系統(tǒng)設置相關界面的方法

    在iOS開發(fā)中,有時會有跳轉(zhuǎn)系統(tǒng)設置界面的需求,例如提示用戶打開藍牙或者WIFI,提醒用戶打開推送或者位置權(quán)限等,接下來通過本文給大家介紹IOS應用內(nèi)跳轉(zhuǎn)系統(tǒng)設置相關界面的方法,喜歡的朋友參考下
    2016-02-02
  • 完整的iOS新浪微博分享功能開發(fā)

    完整的iOS新浪微博分享功能開發(fā)

    這篇文章主要為大家詳細介紹了較為完整的iOS新浪微博分享功能開發(fā)的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • iOS開發(fā)中class和#import的區(qū)別介紹

    iOS開發(fā)中class和#import的區(qū)別介紹

    這篇文章主要介紹了iOS開發(fā)中class和#import的區(qū)別,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-02-02
  • 詳解iOS時間選擇框

    詳解iOS時間選擇框

    這篇文章主要為大家詳細介紹了詳解iOS時間選擇框,感興趣的小伙伴們可以參考一下
    2016-03-03
  • iOS 把圖片保存到相冊,并獲取圖片文件名的實例

    iOS 把圖片保存到相冊,并獲取圖片文件名的實例

    下面小編就為大家分享一篇iOS 把圖片保存到相冊,并獲取圖片文件名的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論