Hooking Instance Variables: Difference between revisions

From iPhone Development Wiki
m (Formatting and Cydia Substrate link.)
m (Unnecessary change inconsistent with standard)
 
Line 1: Line 1:
This page is dedicated to the use of the MSHookIvar function, included in [[Cydia Substrate]], to modify instance variables. This function is meant to be used when one can't get an instance variable through instance methods.
This page is dedicated to the use of the MSHookIvar function, included in [[Cydia Substrate]], to modify instance variables. This function is meant to be used when one can't get an instance variable through instance methods.


= Header definition =
== Header definition ==


<source lang="cpp">
<source lang="cpp">
Line 18: Line 18:
# <tt>ivar_name</tt> is a '''C string''', not an Objective-C string (so no @ sign).
# <tt>ivar_name</tt> is a '''C string''', not an Objective-C string (so no @ sign).


= Example usage =
== Example usage ==


<source lang="logos">
<source lang="logos">

Latest revision as of 03:02, 11 April 2016

This page is dedicated to the use of the MSHookIvar function, included in Cydia Substrate, to modify instance variables. This function is meant to be used when one can't get an instance variable through instance methods.

Header definition

template <typename Type_>
static inline Type_ &MSHookIvar(id self, const char *name);

Used like this:

type ivar = MSHookIvar<type>(object, ivar_name);

Where:

  1. type is a primitive type (int, char, struct CGRect, a pointer or a reference to), a C++ class or an Objective-C class (NSObject *, UILabel *).
  2. object is the variable that contains the target instance variable.
  3. ivar_name is a C string, not an Objective-C string (so no @ sign).

Example usage

// Given a private class
@interface SBIconController : NSObject {
	SBIconContentView *_contentView;
}
+ (id)sharedInstance;
@end

// In some block of code:
{
	...
	SBIconController *iconController = [%c(SBIconController) sharedInstance];
	SBIconContentView *contentView = MSHookIvar<SBIconContentView *>(iconController, "_contentView");
	// Would return the same as [[%c(SBIconController) sharedInstance] contentView];
	...
}