рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдПрдХ рд╡рд┐рд╖рдп рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдИ рдиреМрд╕рд┐рдЦрд┐рдП iPhone рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдХреНрд╕рд░ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рд░рдЦрддреЗ рд╣реИрдВ: рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд░рдирдЯрд╛рдЗрдоред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП?
рдЖрдЗрдП рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╕рд╛рдордЧреНрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬреЛ рд╣рдо рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдХреЛрдЕрд▓рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рд░рдирдЯрд╛рдЗрдо рдХреНрдпрд╛ рд╣реИ?
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреА рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рд╕реА рднрд╛рд╖рд╛ рдХреЗ рдРрдб-рдСрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЧрдИ рдереА, рдЗрд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА, рдирд┐рдпрдорд┐рдд рд╕реАред рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдПрдХ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╕рдореВрд╣ рд╣реИ, рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рднрд╛рд╖рд╛ рдореЗрдВ рдЬреАрд╡рди рдХреЛ рд╕рд╛рдБрд╕ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреА рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ OOP рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред ред
рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ
рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХрд╛рд░реНрдп рдФрд░ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХрдИ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИрдВ:
objc.h
,
runtime.h
рдФрд░
message.h
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
objc.h
рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрдпрд╛ рд╡рд╕реНрддреБ рд╣реИ:
typedef struct objc_class *Class; typedef struct objc_object { Class isa; } *id;
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реА-рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ - рддрдерд╛рдХрдерд┐рдд рдЖрдЗрд╕рд╛-рдкреЙрдЗрдВрдЯрд░ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрдиреЗ рдкрд░ рд╕рднреА рдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ред рдмрджрд▓реЗ рдореЗрдВ, рд╡рд░реНрдЧ рднреА рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ:
struct objc_class { Class isa; };
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдПрдХ рдкреВрд░реНрдг-рд╡рд┐рдХрд╕рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ "рдХреНрд▓рд╛рд╕ рдХреА рдХреНрд▓рд╛рд╕" рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдЗрд╕рд╛-рдкреЙрдЗрдВрдЯрд░ рднреА рд╣реИ, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рддрдерд╛рдХрдерд┐рдд
рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╣реИред рдЗрд╕реА рдкреНрд░рдХрд╛рд░, C- рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд╛рд╖рд╛ рдХреА рдЕрдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
typedef struct objc_selector *SEL; typedef struct objc_method *Method; typedef struct objc_ivar *Ivar; typedef struct objc_category *Category; typedef struct objc_property *objc_property_t;
рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рдВрд╕
рднрд╛рд╖рд╛ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдХрдИ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдирдХреЗ рдирд╛рдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ):
- рдХреНрд▓рд╛рд╕ рдореИрдирд┐рдкреБрд▓реЗрд╢рди:
class_addMethod
, class_addIvar
, class_replaceMethod
- рдирдИ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛:
class_allocateClassPair
, class_registerClassPair
- рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг:
class_getName
, class_getSuperclass
, class_getInstanceVariable
, class_getProperty
, class_copyMethodList
, class_copyIvarList
, class_copyPropertyList
- рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдореИрдирд┐рдкреНрдпреБрд▓реЗрдЯ рдХрд░рдирд╛:
objc_msgSend
, objc_getClass
, object_copy
- рд╕рд╣рдпреЛрдЧреА рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдЙрджрд╛рд╣рд░рдг 1. рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг
рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдорд╛рд░реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреБрдЫ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ:
@interface COConcreteObject : COBaseObject @property(nonatomic, strong) NSString *name; @property(nonatomic, strong) NSString *title; @property(nonatomic, strong) NSNumber *quantity; @end
рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд▓реЙрдЧ рдХрд░рддреЗ рд╕рдордп рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ, рдмрдЬрд╛рдп рдХреБрдЫ
<COConcreteObject: 0x71d6860>
ред рдЪреВрдБрдХрд┐ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рдХрд╛рдлреА рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ
description
рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдирд╛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд░рдирдЯрд╛рдЗрдо рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ:
@implementation COBaseObject - (NSString *)description { NSMutableDictionary *propertyValues = [NSMutableDictionary dictionary]; unsigned int propertyCount; objc_property_t *properties = class_copyPropertyList([self class], &propertyCount); for (unsigned int i = 0; i < propertyCount; i++) { char const *propertyName = property_getName(properties[i]); const char *attr = property_getAttributes(properties[i]); if (attr[1] == '@') { NSString *selector = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]; SEL sel = sel_registerName([selector UTF8String]); NSObject * propertyValue = objc_msgSend(self, sel); propertyValues[selector] = propertyValue.description; } } free(properties); return [NSString stringWithFormat:@"%@: %@", self.class, propertyValues]; } @end
рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐
class_copyPropertyList
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд
class_copyPropertyList
рд╣реИред рдлрд┐рд░ рд╕рдВрдкрддреНрддрд┐ рдорд╛рдиреЛрдВ рдХреЛ рдПрдХ
NSDictionary
рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
NSDictionary
, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗрд╡рд▓ рдЙрди рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ
property_getAttributes
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
2013-05-04 15: 54: 01.992 рдЯреЗрд╕реНрдЯ [40675: 11303] COConcreteObject: {
рдирд╛рдо = рдлреВ;
рдорд╛рддреНрд░рд╛ = 10;
рд╢реАрд░реНрд╖рдХ = рдмрд╛рд░;
}рд╕рдВрджреЗрд╢реЛрдВ
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдореЗрдердб рдЗрдиреНрд╡реЛрдХреЗрд╢рди рд╕рд┐рд╕реНрдЯрдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдХрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд
objc_msgSend
рдлрд╝рдВрдХреНрд╢рди
objc_msgSend
рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
objc_msgSent
рдХреЙрд▓
objc_msgSent
рдХреЛ
objc_msgSent
рдЧрдП рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдерд╛рдХрдерд┐рдд рд╡рд░реНрдЧ рдкреНрд░реЗрд╖рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдорд╛рдВрдЧрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд▓рдВрдмреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХреИрд╢ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдХреА рдкрд╣рд▓реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реА рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рд╕реБрдкрд░рдХреНрд▓реЗрд╕реЗрд╕ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рд╡рдВрд╢рд╛рдиреБрдЧрдд - рдЦреЛрдЬ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред рдпрджрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЦреЛрдЬ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХреА рдЧрдИ рдереА, рддреЛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЦреЛрдЬ рддрдВрддреНрд░
resolveInstanceMethod
рдореЗрдВ рдЖрддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
resolveInstanceMethod
рдпрд╛
resolveClassMethod
ред рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛, рд░рдирдЯрд╛рдЗрдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЕрдВрддрд┐рдо рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
+ (BOOL)resolveInstanceMethod:(SEL)aSelector { if (aSelector == @selector(myDynamicMethod)) { class_addMethod(self, aSelector, (IMP)myDynamicIMP, "v@:"); return YES; } return [super resolveInstanceMethod:aSelector]; }
рдпрд╣рд╛рдБ рдЖрдк рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рддрдВрддреНрд░ рдЖрдкрдХреЛ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрджреЗрд╢
рдЕрдЧреНрд░реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг 2. рд╡рд┐рдзрд┐ рд╕реНрд╡рд┐рдЬрд╝рд▓рд┐рдВрдЧ
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╢реНрд░реЗрдгреА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреА рд╣реИред рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдкрджреНрдзрддрд┐ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдо рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ
NSMutableArray
рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдорд╛рдирдХ рднрд╛рд╖рд╛ рдЙрдкрдХрд░рдг рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╡рд┐рдзрд┐ рд╕реНрд╡рд┐рдЬрд╝рд▓рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
@implementation NSMutableArray (CO) + (void)load { Method addObject = class_getInstanceMethod(self, @selector(addObject:)); Method logAddObject = class_getInstanceMethod(self, @selector(logAddObject:)); method_exchangeImplementations(addObject, logAddObject); } - (void)logAddObject:(id)aObject { [self logAddObject:aObject]; NSLog(@" %@ %@", aObject, self); } @end
рд╣рдо
load
рд╡рд┐рдзрд┐ рдХреЛ
load
рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓рдмреИрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдпрджрд┐ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЖрд░рдВрдн рдХреЗ рджреМрд░рд╛рди - рдЗрд╕рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рд╣рдо рдЖрдзрд╛рд░
addObject:
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрд╡реИрдк рдХрд░рддреЗ рд╣реИрдВ
addObject:
рдкрджреНрдзрддрд┐ рдФрд░ рд╣рдорд╛рд░рд╛
logAddObject:
рд╡рд┐рдзрд┐ред
logAddObject:
рдореЗрдВ "рдкреБрдирд░рд╛рд╡рд░реНрддреА" рдХреЙрд▓ рдкрд░ рдзреНрдпрд╛рди
logAddObject:
рдпрд╣ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдХреЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╣реИред
рдЙрджрд╛рд╣рд░рдг 3. рд╕рд╣рдпреЛрдЧреА рд╕рдВрдмрдВрдз
рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рдПрдХ рдФрд░ рдЬреНрдЮрд╛рдд рд╕реАрдорд╛ рдЙрдирдореЗрдВ рдирдП рдЙрджрд╛рд╣рд░рдг рдЪрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
UITableView
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - "рд╕реНрдЯрдм" рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
@interface UITableView (Additions) @property(nonatomic, strong) UIView *placeholderView; @end
рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рдпрд╣ рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗрдЧрд╛ред рд╕рд╛рд╣рдЪрд░реНрдп рд▓рд┐рдВрдХ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
static char key; @implementation UITableView (Additions) -(void)setPlaceholderView:(UIView *)placeholderView { objc_setAssociatedObject(self, &key, placeholderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(UIView *) placeholderView { return objc_getAssociatedObject(self, &key); } @end
рдЖрдк рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде
objc_setAssociatedObject
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
objc_getAssociatedObject
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
objc_getAssociatedObject
ред рдЙрд╕реА рд╕рдордп, рдЖрдк рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд┐рдП рдЧрдП рдХреБрдВрдЬреА рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реВрдЪрдХ) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ
objc_setAssociatedObject
рдХреЙрд▓ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдм рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭ рд╣реИ рдХрд┐ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд░рдирдЯрд╛рдЗрдо рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рд▓рд╛рд╣ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ: