рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЬрд╛рджреВ: рдордХреНрдЦреА рдкрд░ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдмрджрд▓рдирд╛

рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ 10.6 рд╕рдВрджрд░реНрдн рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдкрдврд╝рдирд╛, рдореБрдЭреЗ рдорд┐рд╢реНрд░рд┐рдд рднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реБрдЖ: рдмрд╣реБрдд рд╕реА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд╛рд╡рд░рдкреАрд╕реА рдкреЙрдкрдкреАрдЬрд╝ рдкрд░ рдирд╣реАрдВ рдЪрд▓ рдкрд╛рдПрдВрдЧреЗ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд░ рдХреЛрдИ рд╕реНрдиреЛ рд▓реЗрдкрд░реНрдб рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд▓рд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╕рд╣рдЬ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдЗрди рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ред рдореИрдВ рдЖрдкрдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡реЗ рдореБрдЭреЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрдиреЛ рд▓реЗрдкрд░реНрдб рдХрд╛ рдкреВрд░рд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдП, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдпрд╣ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ?



рд╢рд╛рдпрдж! рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдкрд╛рд░рджрд░реНрд╢реА рдмрдирд╛ рджреЗрдВрдЧреЗред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ (рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ) рдЬреЛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (objc / runtime.h) рдХреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдорджрдж рд╕реЗ рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рддрд░реАрдХреЗ рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрдердб рдЗрдВрдкреНрд▓реАрдореЗрдВрдЯреНрд╕ рдХреЛ рд░рд┐рдкреНрд▓реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреА рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди! рдЕрдиреНрдп (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд) рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЖрдк рд╕рдорд╛рди рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред



рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкрд░рд┐рднрд╛рд╖рд╛



рдХреЛрдХреЛ рдХреЗрд╡рд▓ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рдПрдХ рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдХреЛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдмреИрдХрдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрди рддрдереНрдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреЛрдХреЛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ: рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЧреЗрд╕реНрдЯрд╛рд▓реНрдЯ рдкреНрд░рдмрдВрдзрдХ рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рд╕реАрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



SInt32 version;



Gestalt(gestaltSystemVersionMinor, &version);



if (version <= 5) {

// 10.5

}

else {

// 10.6 and later

}








рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ



рдЖрдк рдмрд╕ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд╕рдордп, рди рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдФрд░ рди рд╣реА рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдЖрдк (рдФрд░, рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ) рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП class_addMethod рдлрд╝рдВрдХреНрд╢рди (рдХреНрд▓рд╛рд╕ cls, SEL рдирд╛рдо, рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд, const char * рдкреНрд░рдХрд╛рд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: andInstanceMethod: рдпрд╛ resolutionClassMethod: рд╡рд░реНрдЧ рдпрд╛ рдЖрд╡реГрддреНрддрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпрд╛рдБред рд╕рдВрджреЗрд╢ рдЕрдЧреНрд░реЗрд╖рдг рддрдВрддреНрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдХреЛ рджреНрд╡рд╛рд░рд╛ рдпреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред



+ (BOOL) resolveInstanceMethod: (SEL) aSEL {



if (aSEL == @selector(null)) {

class_addMethod([self class], aSEL, (IMP) _null, "v@:");

return YES;

}

else if (aSEL == @selector(isHidden)) {

class_addMethod([self class], aSEL, (IMP) _isHidden, "c@:");

return YES;

}

else if (aSEL == @selector(setHidden:)) {

class_addMethod([self class], aSEL, (IMP) _setHidden, "v@:c");

return YES;

}



return [super resolveInstanceMethod: aSEL];

}








Class_addMethod рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рддреАрд╕рд░рд╛ рддрд░реНрдХ рд╣реИ - рд╡рд╛рдкрд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдЬреЛ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рджреЛ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░: рд╕реНрд╡ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ _cmd рдЪрдпрдирдХрд░реНрддрд╛, рд╕реНрдкрд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рджред



рдЪрд░рд┐рддреНрд░ рдХреЛрдб рддрд╛рд▓рд┐рдХрд╛:



: :



c char

i int

s short

l long, l 32 64-

q long long

C unsigned char

I unsigned int

S unsigned short

L unsigned long

Q unsigned long long

f float

d double

B C++ bool C99 _Bool

v void

* (char *)

@

# (Class)

: (SEL)

[array type]

{name=type...} (struct)

(name=type...) (union)

b num num

^ type type

? ( )








рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдФрд░ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдХреАрдорд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП @encode () рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:



const char *types = [[NSString stringWithFormat: @"%s%s%s%s", @encode(void), @encode(id), @encode(SEL), @encode(BOOL)] UTF8String];







рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд▓рд╛рдкрддрд╛ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЪрдпрдирдХрд░реНрддрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП NO рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛:



if (aSEL == @selector(setHidden:)) {

class_addMethod([self class], aSEL, (IMP) _setHidden, "v@:c");

return NO;

}








рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХреЛрдХреЛ рд╕реЗ рдПрдХ рдореМрдЬреВрджрд╛ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдмрд╕ рдЕрдЧрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо 10.5 рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рдкрд░ рд╡рд┐рдзрд┐ рдЧрд╛рдпрдм рд╣реИ, рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдЧрд░ рдпрд╣ 10.6 рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╡рд┐рдзрд┐ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЪрдпрдирдХрд░реНрддрд╛ рддрд░реНрдХ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред InstanceMethod: рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред



рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╕рд░реА рдмрд╛рдд, рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рдирд┐рдЬреА рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ, рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрд░рдорд╢рдГ, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдХрд▓реНрдкред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдкрдХреЛ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ (рдЧреИрд░-рдХреЛрдХреЛ) рд╡рд┐рдзрд┐ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╕рд░реНрдХрд┐рдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд░реНрдЧ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдЗрд╕ рд╕рдм рдХреЗ рдХрд╛рд░рдг, рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ if`mi рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реЗ рдмрдЪреЗрдВред



рд╣рдо рд╡рд┐рдзрд┐ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ



рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рджреВрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо + рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдореЗрдердб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдореИрд╕реЗрдЬ рдХреЛрдХреЛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрджреЗрд╢ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рд╣рдо class_replaceMethod рдлрд╝рдВрдХреНрд╢рди (рдХреНрд▓рд╛рд╕ cls, SEL рдирд╛рдо, рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд, const char * рдкреНрд░рдХрд╛рд░) рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡рд┐рдзрд┐ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕реЗ class_ddMethod рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ , рдпрджрд┐ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ method_setImplementation рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЗрди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдЦрд╛рд▓реА рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



+ initialize {



SInt32 version;



Gestalt(gestaltSystemVersionMinor, &version);



const char *types = [[NSString stringWithFormat: @"%s%s%s", , @encode(BOOL), @encode(id), @encode(SEL)] UTF8String];



if (version < 6) {

class_replaceMethod([self class], @selector(isHidden), (IMP) Legacy_HSFileSystemItem_IsHidden, types);

}

else {

class_replaceMethod([self class], @selector(isHidden), (IMP) HSFileSystemItem_isHidden, types);

}

}



- (BOOL) isHidden {



return NO;

}








рд╣рдо рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ



рдФрд░ рдлрд┐рд░ рднреА, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрдирдХреЗ рдЙрдЪрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ 10.5 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рдЕрдиреНрдп рдЧреИрд░-рд░рдЪрдирд╛рддреНрдордХ рдмрдХрд╡рд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдХреЛ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдлрд┐рд░ рд╡рд┐рд░рд╛рд╕рдд рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ!



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрд╛рдЗрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, class_getClassMethod (рдХреНрд▓рд╛рд╕ cls, SEL name) , class_getInstanceMethod (рдХреНрд▓рд╛рд╕ cls, SEL name) рдФрд░ method_setImplementation (рд╡рд┐рдзрд┐ m, IMP imp) рдореЗрдердб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдпрд╣ рд╡рд┐рдзрд┐ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред



рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг:



// HSFileSystemItem.m



#import "HSFileSystemItem.h"



#ifdef __HS_Legacy__



#import "HSFileSystemItem_Legacy.h"

#import <CoreServices/CoreServices.h>



#endif // __HS_Legacy__



@implementation HSFileSystemItem



#ifdef __HS_Legacy__



+ initialize {



SInt32 version;



Gestalt(gestaltSystemVersionMinor, &version);



if (version < 6) {

Method _isHidden_method = class_getInstanceMethod([self class], @selector(isHidden));

method_setImplementation(_isHidden_method, (IMP) HSFileSystemItem_isHidden);

}

}



#endif // __HS_Legacy__



- (BOOL) isHidden {



id value = nil;

[_url getResourceValue: &value forKey: NSURLIsHiddenKey error: nil];



return [value boolValue];

}



// Other



@end








рд▓реЗрдХрд┐рди рд╡рд░реНрдЧ рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╢реНрд░реЗрдгреА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдП? + рднрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИрдВ, рдПрдХ рд╡рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА рдХрд╛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдорд╣рд╛рди рд╣реИ, рд╣реИ рдирд╛?



рдЙрджрд╛рд╣рд░рдг рдЪрд░



рдЖрдЦрд┐рд░ рд╣реИ рднреА рдпрд╛ рдирд╣реАрдВ? рдЕрдиреБрддреНрддрд░рд┐рдд рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдЪрд░ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЖрдк рдмрд╕ рд╕реЗрдЯрд░, рдЧреЗрдЯреНрдЯрд░ рдпрд╛ рдХреЗрд╡реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛, рдпрджрд┐ рдЖрдк рдЖрд╕рд╛рди рддрд░реАрдХреЗ, рдСрдмреНрдЬреЗрдХреНрдЯ_getInstanceVariable (рдЖрдИрдбреА obj, const char * name, void ** outValue) , object_setInInanceanceVariable (рдЖрдИрдбреА obj, const char * name, void * value), class_getInstanceVariable рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдХрдХреНрд╖рд╛ рд╕реАрдПрд▓, рдХрд╛рд╕реНрдЯ рдЪрд╛рд░ * рдирд╛рдо) ред



рдкрд╣рд▓реЗ рджреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдЪрд░ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рддреАрди рдлрд╝рдВрдХреНрд╢рдВрд╕ Ivar рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬреЛ рдХрд┐ рдХреИрдЪ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдИ рдмрд╛рд░ рдЪрд░ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ_getIvar (id obj, Ivar ivar) , object_setIvar (id ob, Ivar ivar, id value) рдХреЗ рд╕рд╛рде Ivar рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред



// HSFileSystemItem_Legacy.m



#import <ApplicationServices/ApplicationServices.h>

#import <CoreServices/CoreServices.h>

#import <objc/runtime.h>

#import "HSFileSystemItem.h"



static BOOL HSFileSystemItem_isHidden(id self, SEL _cmd)

{

NSURL *_url = nil;

object_getInstanceVariable(self, "_url", &_url);



LSItemInfoRecord itemInfo;



// Get file`s item info

OSStatus err = LSCopyItemInfoForURL((CFURLRef) _url, kLSRequestAllFlags, &itemInfo);



if (err != noErr) {

NSLog(@"LSCopyItemInfoForURL: error getting item info for %@. The error returned was: %d", _url, err);

}



return itemInfo.flags & kLSItemInfoIsInvisible;

}








рдпрд╛



static BOOL HSFileSystemItem_isHidden(id self, SEL _cmd)

{

static Ivar _url_ivar = class_getInstanceVariable([self class], "_url");

NSURL *_url = object_getIvar(self, _url_ivar);



// Get file`s item info

OSStatus err = LSCopyItemInfoForURL((CFURLRef) _url, kLSRequestAllFlags, &itemInfo);



if (err != noErr) {

NSLog(@"LSCopyItemInfoForURL: error getting item info for %@. The error returned was: %d", _url, err);

}



return itemInfo.flags & kLSItemInfoIsInvisible;

}








рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдЪрд░ - рдирд┐рдпрдорд┐рдд C рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рддреЛ object_getInstanceVariable , object_setInstanceVariable , object_getIvar , object_setIvar рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ! рд╡реЗ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдЪрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдХреЗрдд рд╣реИрдВред рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЪрд╛рд╣реЗ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ, рдЙрдирдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реИ: 32 рдпрд╛ 64 рдмрд┐рдЯреНрд╕ред рдпрджрд┐ рдЪрд░ рдХрд╛ рдЖрдХрд╛рд░ рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ:



static Ivar _int_ivar = class_getInstanceVariable([self class], "_num");

int *_num = (int *) ((uint8_t *) self + ivar_getOffset(ivar));








рдпрд╛ рдЖрдк рдЬреЙрди рдХреИрд▓реНрд╕рдмреЗрдХ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд NSObject рд╢реНрд░реЗрдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЗрдЪреНрдЫрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ ;-)):



@implementation NSObject (InstanceVariableForKey)



- (void *) instanceVariableForKey: (NSString *) aKey {

if (aKey) {

Ivar ivar = object_getInstanceVariable(self, [aKey UTF8String], NULL);

if (ivar) {

return (void *)((char *)self + ivar_getOffset(ivar));

}

}

return NULL;

}



@end








int _num = *(int *) [self instanceVariableForKey: "_num"];







рдЙрдкрд╕рдВрд╣рд╛рд░



рдмреЛрдирд╕: рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рд╡рд┐рдзрд┐ рдХреЛ рдкрд╣рд▓реА рдХреЙрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЖрдкрдХреЛ рдПрдХ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ; ;-))



- (BOOL) isHidden {



SInt32 version;



Gestalt(gestaltSystemVersionMinor, &version);



const char *types = [[NSString stringWithFormat: @"%s%s%s", , @encode(BOOL), @encode(id), @encode(SEL)] UTF8String];



if (version < 6) {

class_replaceMethod([self class], _cmd, (IMP) HSFileSystemItem_Legacy_IsHidden, types);

}

else {

class_replaceMethod([self class], _cmd, (IMP) HSFileSystemItem_isHidden, types);

}



return [self isHidden];

}








рд╕рдВрджрд░реНрдн





рдореБрдЦреНрдп рд▓рд┐рдВрдХ:

Gestalt_Manager / рд╕рдВрджрд░реНрдн / рд╕рдВрджрд░реНрднред Html

ObjCRuntimeGuide / рдкрд░рд┐рдЪрдп / рдкрд░рд┐рдЪрдпред html

ObjCRuntimeRef / рд╕рдВрджрд░реНрдн / рд╕рдВрджрд░реНрднред Html

NSObject_Class / рд╕рдВрджрд░реНрдн / рд╕рдВрджрд░реНрднред Html



рд╕рдВрджрд░реНрдн:

http://cocoasamurai.blogspot.com/2010/01/understanding-objective-c-runtime.html

http://mikeash.com/pyblog/friday-qa-2009-03-13-intro-to-the-objective-c-runtime.html

http://stackoverflow.com/questions/1219081/object-getinstancevariable-works-for-float-int-bool-but-not-for-double



All Articles