object_getIvar 获得类的变量(包括“所谓私有变量”)
~~~
/**
* Reads the value of an instance variable in an object.
*
* @param obj The object containing the instance variable whose value you want to read.
* @param ivar The Ivar describing the instance variable whose value you want to read.
*
* @return The value of the instance variable specified by \e ivar, or \c nil if \e object is \c nil.
*
* @note \c object_getIvar is faster than \c object_getInstanceVariable if the Ivar
* for the instance variable is already known.
*/
OBJC_EXPORT id object_getIvar(id obj, Ivar ivar)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
~~~
~~~
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic, assign) NSInteger age;
@property(nonatomic, strong) NSString * name;
@end
~~~
~~~
#import "Person.h"
@interface Person ()
@property(nonatomic, strong) NSString * sex;
@end
@implementation Person
- (instancetype)init
{
self = [super init];
if (self) {
self.sex = @"-----------";
}
return self;
}
@end
~~~
~~~
#import "ViewController.h"
#import <objc/runtime.h>
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person * p1 = [[Person alloc] init];
Ivar ivar = class_getInstanceVariable([p1 class], "_sex");
id sex = object_getIvar(p1, ivar);
NSLog(@"%@", sex);
}
~~~
输出:
![](https://box.kancloud.cn/2016-05-05_572b0152c7088.jpg)
- 前言
- object_getIvar
- object_getClass
- object_getClassName
- object_setClass
- object_isClass
- object_setIvar
- objc_getClass
- Too many arguments to function call...
- objc_msgSend
- class_copyIvarList和class_copyMethodList
- method_exchangeImplementations
- 运用SEL,运行时改变两个方法的实现
- class_getInstanceMethod和class_getClassMethod
- class_respondsToSelector
- Objective-C Runtime 运行时之三:方法与消息