
рдкреНрд░рдгрд╛рдо рдкреНрд░рд┐рдп рд╣рд░рдЬрд┐рддрдорд▓рдореН!
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдПрдХ рд╕рдореГрджреНрдз рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рд╣реЗрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА
<objc/runtime.h>
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕реНрд╡рдпрдВ рднрд╛рд╖рд╛ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рдЖрдк рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдкрдврд╝рддреЗ рд╕рдордп рдЙрди рдкрд░ рдерд┐рд░рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЦреБрдж рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ "рд╣рдореНрдо, рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЦреЛрджрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ," рд▓реЗрдХрд┐рди рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдореЗрд░реЗ рд╕рд┐рд░ рд╕реЗ рдЬрд▓реНрджреА рдЙрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдиреМрд╕рд┐рдЦрд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдХреНрд╕рд░ рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рднрд╛рд╖рд╛ рдХреЗ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдЧреБрдгреЛрдВ рдореЗрдВ 10 рдЕрджреНрднреБрдд рдПрдХрддреНрд░ рдХрд┐рдП рд╣реИрдВред рдХреБрдЫ рдЧреБрдг рд╕реНрд╡рдпрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдХреБрдЫ рдРрд╕реЗ рд╣реЛрдиреЗ рд╕реЗ рджреВрд░ рд╣реИрдВред рдпреБрджреНрдз рдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╣рд╛рдереЛрдВ рдХреЛ рд╣рд░рд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдХреЛрдб рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдЗрди рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреА рд░рд╛рдп рдореЗрдВ рд╕рдмрд╕реЗ "рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ" рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛: рдирд╛рдорд╣реАрди рддрд░реАрдХреЗред
1. рддрд░реАрдХреЗ
рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдпрджрд┐ рдЗрд╕рдореЗрдВ рддрд░реНрдХ рд╣реИрдВред рдЕрдХреНрд╕рд░ рдРрд╕реА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ
- (void)setSize:(CGFloat)x :(CGFloat)y
, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреВрд░реНрдг рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
@interface TestObject : NSObject + (id):(int)value; - (void):(int)a; - (void):(int)a :(int)b; @end // ... TestObject *obj = [TestObject :2]; [obj :4]; [obj :5 :7];
рдирд┐рдореНрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЪрдпрдирдХрд░реНрддрд╛ рднреА
@selector(:)
:
@selector(:)
рдФрд░
@selector(::)
ред
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: рдЕрдиреБрд╕рдВрдзрд╛рди рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реАред
2. рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдпрд╛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВред
рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
- (id)objectAtIndexedSubscript:(NSUInteger)index; - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index;
рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
- (id)objectForKeyedSubscript:(id)key; - (void)setObject:(id)obj forKeyedSubscript:(id)key;
рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
id a = obj[1]; obj[@"key"] = a;
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: рдХрднреА-рдХрднреА рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
3. рдЗрдореНрдкреНрд▓рд┐рдореЗрдВрдЯ @property
рд╣реЗрдбрд░ рдореЗрдВ
@property
рдШреЛрд╖рдгрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рдореНрдпреВрдЯреЗрдЯрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛:
- (int)value; - (void)setValue:(int)newValue; obj.value = 2; int i = obj.value;
рдирд┐рд╣рд┐рдд рдЧреБрдг рднреА рдХреЛрдИ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рдореВрд▓реНрдп рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ:
NSArray *a = @[@1, @2, @3]; NSInteger c = a.count;
рдФрд░ рдпрд╣ рднреА - рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо "рд╕реЗрдЯ" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛:
@interface TestObject : NSObject - (void)setTitle:(NSString *)title; @end; //... TestObject *obj = [TestObject new]; obj.title = @"simple object";
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ: @property
рд╡рд┐рдЬреНрдЮрд╛рдкрди рдмрд╣реБрдд рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред "" "рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдзрд╛рд░рдг рддрд░реАрдХреЛрдВ рд╕реЗ"
[]
"рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЕрдиреНрдпрдерд╛, рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрд╣реБрдд рдиреБрдХрд╕рд╛рди рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИред
4. рдмрд┐рдирд╛ рдЖрд╡рдВрдЯрди рдХреЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХрд╛ рдореИрдиреБрдЕрд▓ рдЖрд╡рдВрдЯрди
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрд░рд╛рдиреЗ рдкреБрд░рд╛рдиреЗ
calloc
рдлрд╝рдВрдХреНрд╢рди
calloc
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣
alloc
рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ, рдФрд░
alloc
рдмрд╛рдж рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд┐рддред рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реИ (рдЬреИрд╕рд╛
рдХрд┐ рдПрд▓реЗрдХреНрд╕рд╣рд░реНрдиреА рдиреЗ рдПрдХ рдмрд╛рд░
рдХреЛрдХреЛрд╣реЗрдбреНрд╕ рдХреЛ рдмрддрд╛рдпрд╛ рдерд╛ )ред
UPD: рдЯреНрд░рд╛рд╣реИрди рдпреВрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж,
рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг iOS x64 рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреА рдорджрдж рд╕реЗ, рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛:
object_setClass((__bridge id)newObject, [TestObject class]);
5. рд╡рд░реНрддрдорд╛рди рд╕рдВрд▓реЗрдЦрди рдкреВрд▓ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ
ObjC рдореЗрдВ "рдЫрд┐рдкреЗ рд╣реБрдП" рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ
extern
рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
extern void _objc_autoreleasePoolPrint(void);
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреВрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓рдЧрднрдЧ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ:
objc[26573]:
рдпрд╣ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
www.opensource.apple.com/source/objc4/objc4/555.1рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: рдбрд┐рдмрдЧ рдореЗрдВ - рдХреГрдкрдпрд╛ред
6. рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд @property
рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдзреА рдкрд╣реБрдБрдЪ
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
@property
рдХреЗрд╡рд▓ рдЧреЗрдЯрдЯрд░ рдФрд░ рдореНрдпреВрдЯреЗрдЯрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (
@synthesize
рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ), рддреЛ ivar рднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ:
@property NSMutableDictionary *dict; - (void)resetDict { _dict = nil; }
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдЖрдЗрд╡рд░ рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдХреЛ рдХрднреА-рдХрднреА рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рдореНрдпреВрдЯреЗрдЯрд░ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ ivars рддрдХ рдкрд╣реБрдБрдЪ
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
@interface TestObject : NSObject { @public int field; } @implementation TestObject - (void)updateWithField:(int)field { self->field = field; } @end
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: ObjC рдореЗрдВ рдРрд╕реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП @property рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
8. instancetype
ObjC рдХрд╛ рдПрдХ рдЕрджреНрднреБрдд
id
рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ
NSObject *
, рдЕрд░реНрдерд╛рдд, рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓реА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ред рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
[[MyClass sharedInstance] count];
рдпрджрд┐
sharedInstance
рд╣реИ, рддреЛ
id
рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
sharedInstance
рдореЗрдВ рдХреЛрдИ
count
рдкрджреНрдзрддрд┐ рди рд╣реЛрдиреЗ рдкрд░ рднреА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐
sharedInstance
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд┐рд░ рднреА рд╡реЛрд░рд┐рдВрдЧ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП
sharedInstance
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: init/new/copy
, рдЖрджрд┐ рдЬреИрд╕реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд
9. рд╕рдореАрдкрд╡рд░реНрддреА: рдЕрдЧреНрд░реЗрд╖рдгрдЯрд╛рд░реНрдЧрдлреЙрд░рд╕реЗрдХреНрдЯрд░: рдФрд░ forwardInvocation:
OOP рдХреЛ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░реЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╣рдореЗрд╢рд╛ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдВрдЧреЗред
рдпрджрд┐ рдХреБрдЫ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рдЗрд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛:
- (id)forwardingTargetForSelector:(SEL)aSelector { if ([_dict respondsToSelector:aSelector]) { return _dict; } return [super forwardingTargetForSelector:aSelector]; }
рдпрджрд┐ рд╣рдо рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЛ рдЬрд╡рд╛рдм рджреЗрддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдЙрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВред рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ рдЕрднреА рднреА рд░рд┐рд╕реЗрдкреНрд╢рди рдлреЗрдВрдХрдирд╛ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рд╣рдо рди рдХреЗрд╡рд▓ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБ рдХреЗ рдореМрдЬреВрджрд╛ рддрд░реАрдХреЗ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { NSMethodSignature *sig = [super methodSignatureForSelector:aSelector]; if ([NSStringFromSelector(aSelector) isEqualToString:@"allDamnKeys"]) { sig = [_dict methodSignatureForSelector:@selector(allKeys)]; } return sig; }
рдлрд┐рд░ рд╣рдо рдХреЙрд▓ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрдпрдирдХрд░реНрддрд╛ рдХрд╛ рдирд╛рдо рдмрджрд▓рддреЗ рд╣реИрдВ:
- (void)forwardInvocation:(NSInvocation *)anInvocation { if ([NSStringFromSelector(anInvocation.selector) isEqualToString:@"allDamnKeys"]) { anInvocation.selector = @selector(allKeys); [anInvocation invokeWithTarget:_dict]; } }
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: рдЫрджреНрдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдорд┐рд▓реЗрдВрдЧреЗред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдЕрддрд┐ рдирд╣реАрдВ рд╣реИ: рдХреЛрдб рдХреЛ рдкрдардиреАрдп рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
10. NSFastEnumeration
рдЦреИрд░, рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, ObjC рдХреА рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛:
for..in
рд▓реВрдкреНрд╕ред рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдЧреНрд░рд╣ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
NSFastEnumeration
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдмрд▓реНрдХрд┐,
countByEnumeratingWithState:objects:count:
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
countByEnumeratingWithState:objects:count:
method, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ! рдпрд╣рд╛рдБ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ:
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╣рд░ рдмрд╛рд░ рд░рдирдЯрд╛рдЗрдо рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╣рдо рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рднрд╛рдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╛ рддреЛ рджрд┐рдП рдЧрдП рдмрдлрд╝рд░ (рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░) рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдЕрдкрдирд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдмрдлрд╝рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ
state->itemsPtr
рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ (рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ)
state->mutationsPtr
рдХреНрд╖реЗрддреНрд░ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд
SEGFAULT
рдорд┐рд▓реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдХреНрд╖реЗрддреНрд░
state->state
рдЖрдк рдХреБрдЫ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рджрд┐рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВред рдпрджрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len { if (state->state >= _value) { return 0; } NSUInteger itemsToGive = MIN(len, _value - state->state); for (NSUInteger i = 0; i < itemsToGive; ++i) { buffer[i] = @(_values[i + state->state]); } state->itemsPtr = buffer; state->mutationsPtr = &state->extra[0]; state->state += itemsToGive; return itemsToGive; }
рдЕрдм рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
for (NSNumber *n in obj) { NSLog(@"n = %@", n); }
рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ: рдХрд╕реНрдЯрдо рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЗрдбрд╝реЛрдВ рдФрд░ рдЬреБрдбрд╝реЗ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред
рдирд┐рд╖реНрдХрд░реНрд╖
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб
рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрджрд┐ рдЖрдк, рдкреНрд░рд┐рдп рдкрд╛рдардХ, рдкреВрд░рдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ - рд╢рд░реНрдореАрд▓реА рди рд╣реЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред
рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ рдФрд░ рдХреНрд▓реИрдВрдЧ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ!