рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЗрдЦ "рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдмрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ
рд╣рдбреНрдбрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред"
рдпрд╣рд╛рдБ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рд╛рд▓рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред
рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗред
рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡рд▓реА рдЬрд╕реНрдЯ рдлрди рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкреИрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдирд╛рдЪрддреЗ рд╣реБрдП рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдХреЗрд╡рд▓ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ?
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдФрд░ рдЬреЛрдЦрд┐рдо рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдЖрдкрдХреЛ рд╕рдорд╛рдирддрд╛ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ:
factorial( 0 ) -> 1
factorial( 1 ) -> 1
factorial( n ) -> n * factorial( n - 1 )
рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо NSObject рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рдкреЗрдЯреЗрдВрдЧреЗред
typedef id ( ^ PatternMatchingBlock ) ( рдЖрдИрдбреА obj ) ;
@interface NSObject ( рдкреИрдЯрд░реНрди рдореЗрдХрд┐рдВрдЧ )
- ( рд╢реВрдиреНрдп ) рд╡рд┐рдзрд┐ : ( SEL ) sel_ withParameter : ( id ) object_ useBlock : ( PatternMatchingBlock ) block_;
@end
рдЕрдм рд╣рдореЗрдВ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рд░рд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рд╡рд┐рдзрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд┐рдзрд┐ (
рдореЗрдердб рд╕реНрд╡рд┐рдЬрд╝рд▓рд┐рдВрдЧ ) рдЗрд╕рд╕реЗ рдорджрдж рдХрд░реЗрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░
objc_method
рдХреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рдЯрд╛рдЗрдк
IMP
рдХреЗ
method_imp
рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
IMP
, рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ C-function рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред рд╡рд┐рдзрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдЕрд░реНрде рдЗрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ 2 рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИред рд╣рдо рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреА рдХреБрдВрдЬреА "рдЪрд┐рддреНрд░" рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реЛрдВрдЧреА, рдФрд░ рдореВрд▓реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреНрд▓реЙрдХ рд╣реИрдВ:
@interface PMIm рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди : NSObject
@property ( рдиреЙрдирдЯреЛрдорд┐рдХ, рд░рд┐рдЯреЗрди ) NSMutableDictionary * рдЗрдкреНрд╕;
@property ( рдиреЙрдирдЯреЛрдорд┐рдХ, рд░рд┐рдЯреЗрди ) NSValue * defaultImpl;
+ ( id ) рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрдиWithDefaultImpl : ( IMP ) impl_;
- ( id ) forObject : ( id ) object_ invokeWithParameter : ( id ) рдкреИрд░рд╛рдореАрдЯрд░_;
@end
рд╕реНрдерд┐рд░ рдЪрд╛рд░ * PMimplsKey = рдиреАрд▓ ;
@ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди PMIm рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
@synthesize impls = _impls;
@synthesize defaultImpl = _default_impl;
- ( рд╢реВрдиреНрдп ) рдбреАрд▓рд▓реЛрдХ {
[ _impls рдЬрд╛рд░реА ] ;
[ _default_impl рд░рд┐рд▓реАрдЬ ] ;
[ рд╕реБрдкрд░ рдбреАрд▓реЙрдХ ] ;
}
- ( рдЖрдИрдбреА ) initWithDefaultImpl : ( IMP ) impl_ {
рдЕрдЧрд░ ( ( рд╕реНрд╡ = [ рд╕реБрдкрд░ рдЗрдирд┐рдЯ ] ) )
рд╡рд╛рдкрд╕реА ;
self.defaultImpl = [ NSValue valueWithPointer : impl_ ] ;
self.impls = [ NSMutableDictionary рд╢рдмреНрджрдХреЛрд╢ ] ;
рд╕реНрд╡ рд▓реМрдЯ рдЖрдУ;
}
+ ( рдЖрдИрдбреА ) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╡рд╛рдкрд╕реА [ [ [ рдЖрддреНрдо рдЖрд╡рдВрдЯрди ] initWithDefaultImpl : impl_ ] рдСрдЯреЛрд░реЗрд▓рд┐рдЬрд╝ ] ;
}
- ( id ) forObject : ( id ) object_ invokeWithParameter : ( id ) рдкреИрд░рд╛рдореАрдЯрд░_ {
рдХреЗ рд▓рд┐рдП ( рдЖрдИрдбреА key_ рдореЗрдВ [ self.impls allKeys ] )
рдЕрдЧрд░ ( [ key_ isEqual : рдкреИрд░рд╛рдореАрдЯрд░_ ] ) {
PatternMatchingBlock block_ = [ self.impls objectForKey : key_ ] ;
рд╡рд╛рдкрд╕реА block_ ( рдкреИрд░рд╛рдореАрдЯрд░_ ) ;
}
рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд_ = [ self.defaultImpl pointerValue ] ;
рд╡рд╛рдкрд╕реА impl_ ( object_, _cmd, рдкреИрд░рд╛рдореАрдЯрд░_ ) ;
}
@end
рдФрд░ NSObject рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
@ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди NSObject ( рдкреИрдЯрд░реНрди рдореЗрдХрд┐рдВрдЧ )
- ( NSMutable рдордВрдж * * ) {
NSMutablelife * impls_ = objc_getAssociatedObject ( рд╕реНрд╡рдпрдВ, рдФрд░ PMImplsKey ) ;
рдЕрдЧрд░ ( impls_ ) {
impls_ = [ NSMutableDictionary рд╢рдмреНрджрдХреЛрд╢ ] ;
objc_setAssociatedObject ( рд╕реНрд╡рдпрдВ, рдФрд░ PMImplsKey, impls_
, OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}
рд╡рд╛рдкрд╕реА impls_;
}
- ( рд╢реВрдиреНрдп ) рд╡рд┐рдзрд┐ : ( SEL ) sel_ withParameter : ( id ) object_
рдЙрдкрдпреЛрдЧрдмреНрд▓реЙрдХ : ( рдкреИрдЯрд░реНрдирдореИрдЪрд┐рдВрдЧрдмреНрд▓реЙрдХ ) рдмреНрд▓реЙрдХ_ {
NSString * рдЪрдпрдирдХрд░реНрддрд╛_рдХреА_ = NSStringFromSelector ( sel_ ) ;
PMI рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди * impl_ = [ self.impls objectForKey : selector_key_ ] ;
рдЕрдЧрд░ ( impl_ ) {
рд╡рд┐рдзрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ_ = class_getInstanceMethod ( [ рд╕реНрд╡ рд╡рд░реНрдЧ ] , sel_ ) ;
IMP default_impl_ = method_getImplementation ( default_ ) ;
impl_ = [ рдкреНрд░рдзрд╛рди рдордВрддреНрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиWithDefaultImpl : default_impl_ ] ;
[ self.impls setObject : impl_ forKey : selector_key_ ] ;
рд╡рд┐рдзрд┐ swizzed_method_ = class_getInstanceMethod ( [ рд╕реНрд╡ рд╡рд░реНрдЧ ]
, @selector ( swizzledMethod :) ) ;
method_setImplementation ( default_, method_getImplementation ( swizzed_method_ ) ) ;
}
[ impl_.impls setObject : block_ forKey : object_ ] ;
}
- ( рдЖрдИрдбреА ) swizzledMethod : ( рдЖрдИрдбреА ) obj_ {
PMImplementation * impl_ = [ self.impls objectForKey : NSStringFromSelector ( _cmd ) ] ;
рд╡рд╛рдкрд╕реА [ impl_ forObject : self invokeWithParameter : obj_ ] ;
}
@end
рд╕рднреА рдЬрд╛рджреВ [-SObject рд╡рд┐рдзрд┐: withParameter: useBlock:] рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИред рдкрд╛рд░рд┐рдд рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреАрдПрдордЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рддрдм рд╣рдо рдЗрд╕реЗ тАЬswizzledMethod:тАЭ рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЛ _cmd рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдЪрдпрдирдХрд░реНрддрд╛ рдХреЛ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдирд┐рд╣рд┐рдд рд╣реИред рдЕрдм, рдЬрдм swizzledMethod рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ [-PMImplementation forObject: invokeWithParameter:] рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рд╣рдо рдпрд╛ рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдмреНрд▓реЙрдХ рдвреВрдВрдврддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдЕрдорд▓ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
[-SObject impls] рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП PMI рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдм, рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдм рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдереНрдп рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ:
@ рдЗрдВрдЯрд░реНрдлреЗрд╕ рдлрд╝реИрдХреНрдЯрд░ : NSObject
- ( NSDecimalNumber * ) factorial : ( NSDecimalNumber * ) рдирдВрдмрд░_;
@end
@ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдереНрдп
- ( рдЖрдИрдбреА ) init {
рдЕрдЧрд░ ( ( рд╕реНрд╡ = [ рд╕реБрдкрд░ рдЗрдирд┐рдЯ ] ) )
рд╡рд╛рдкрд╕реА ;
NSDecimalNumber * zero_ = [ NSDecimalNumber numberWithInteger : 0 ] ;
[ рд╕реНрд╡рдпрдВ рдХреА рд╡рд┐рдзрд┐ : @selector ( рднрд╛рдЬреНрдп :) withParameter : zero_ useBlock : ^ ( рдЖрдИрдбреА obj_ ) {
рд╡рд╛рдкрд╕реА ( рдЖрдИрдбреА ) [ NSDecimalNumber numberWithInteger : 1 ] ;
} ] ;
NSDecimalNumber * one_ = [ NSDecimalNumber numberWithInteger : 1 ] ;
[ рд╕реНрд╡ рд╡рд┐рдзрд┐ : @selector ( рднрд╛рдЬреНрдп :) withParameter : one_ useBlock : ^ ( рдЖрдИрдбреА obj_ ) {
рд╡рд╛рдкрд╕реА ( рдЖрдИрдбреА ) [ NSDecimalNumber numberWithInteger : 1 ] ;
} ] ;
рд╕реНрд╡ рд▓реМрдЯ рдЖрдУ;
}
- ( NSDecimalNumber * ) factorial : ( NSDecimalNumber * ) рдирдВрдмрд░_ {
рд╡рд╛рдкрд╕реА [ рд╕рдВрдЦреНрдпрд╛_ рджрд╢рдорд▓рд╡
[ рдЖрддреНрдо рддрдереНрдп : [ рд╕рдВрдЦреНрдпрд╛_ рджрд╢рдорд▓рд╡
[ NSDecimalNumber numberWithInteger : 1 ] ] ] ] ;
}
рдпрд╣ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдлреИрдХреНрдЯрд░рд┐рдпрд▓ * factorial_ = [ [ рдлрд╝реИрдХреНрдЯрд░рд┐рдпрд▓ рдирдпрд╛ ] рдСрдЯреЛрд░реЗрд▓рд┐рдЬрд╝ ] ;
NSNumber * number_ = [ NSDecimalNumber numberWithInteger : 10 ] ;
NSLog ( @ "factorial% @ =% @" , рдирдВрдмрд░_, [ factorial_ factorial : number_ ] ) ;
factorial 10 = 3628800
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд╡рд░реНрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо isEqual: рд╡рд┐рдзрд┐ рдФрд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореИрдХреНрд░реЛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
#define PMCLASS (x) [[[PMClass рдЖрдмрдВрдЯрд┐рдд] initWith: [x class]] рдСрдЯреЛрдмреЗрдЧрд▓]
@interface PMClass : NSObject <NSCopying>
@property ( рдиреЙрдирдЯреЛрдорд┐рдХ, рд░рд┐рдЯреЗрди ) рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕;
- ( рдЖрдИрдбреА ) init рдЗрд╕рдХреЗ рд╕рд╛рде : ( рдХрдХреНрд╖рд╛ ) class_;
@end
@ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди PMClass
@synthesize class = _class;
- ( рд╢реВрдиреНрдп ) рдбреАрд▓рд▓реЛрдХ {
[ _рдХреНрд▓рд╛рд╕ рд░рд┐рд▓реАрдЬрд╝ ] ;
[ рд╕реБрдкрд░ рдбреАрд▓реЙрдХ ] ;
}
- ( рдЖрдИрдбреА ) init рд╕рд╛рде : ( рдХрдХреНрд╖рд╛ ) рд╡рд░реНрдЧ_ {
рдЕрдЧрд░ ( ( рд╕реНрд╡ = [ рд╕реБрдкрд░ рдЗрдирд┐рдЯ ] ) )
рд╡рд╛рдкрд╕реА ;
self.class = class_;
рд╕реНрд╡ рд▓реМрдЯ рдЖрдУ;
}
- ( BOOL ) рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ : ( рдЖрдИрдбреА ) рдСрдмреНрдЬреЗрдХреНрдЯ_ {
рд╡рд╛рдкрд╕реА [ self.class isququal : [ object_ class ] ] ;
}
- ( рдЖрдИрдбреА ) copyWithZone : ( NSZone * ) рдЬрд╝реЛрди_ {
рд╡рд╛рдкрд╕реА [ [ PMClass рдЖрд╡рдВрдЯрд┐рдд ] initWith : self.class ] ;
}
@end
рдЕрдм рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@ рдЗрдВрдЯрд░реНрдлреЗрд╕ рдЯреЗрд╕реНрдЯ : NSObject
- ( рд╢реВрдиреНрдп ) рдкрд░реАрдХреНрд╖рдг : ( рдЖрдИрдбреА ) obj_;
@end
@ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░реАрдХреНрд╖рдг
- ( рдЖрдИрдбреА ) init {
рдЕрдЧрд░ ( ( рд╕реНрд╡ = [ рд╕реБрдкрд░ рдЗрдирд┐рдЯ ] ) )
рд╡рд╛рдкрд╕реА ;
[ рд╕реНрд╡рдпрдВ рдХреА рд╡рд┐рдзрд┐ : @selector ( рдкрд░реАрдХреНрд╖рдг :) withParameter : PMCLASS ( NSNull ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдмреНрд▓реЙрдХ : ^ ( рдЖрдИрдбреА obj_ ) {
NSLog ( @ "рдирд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:% @" , [ obj_ рд╡рд░реНрдЧ ] ) ;
return ( id ) nil ;
} ] ;
рд╕реНрд╡ рд▓реМрдЯ рдЖрдУ;
}
- ( рд╢реВрдиреНрдп ) рдкрд░реАрдХреНрд╖рдг : ( рдЖрдИрдбреА ) obj_ {
NSLog ( @ "рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд╣рд┐рддрд╛рд░реНрде:% @" , [ obj_ рд╡рд░реНрдЧ ] ) ;
}
@end
рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
рдЯреЗрд╕реНрдЯ * test_ = [ [ рдЯреЗрд╕реНрдЯ рдирдпрд╛ ] рдСрдЯреЛрд░рд┐рдПрд▓рд┐рд╕ ] ;
[ test_ test : @ "рд╕реНрдЯреНрд░рд┐рдВрдЧ" ] ;
[ test_ test : [ NSNull null ] ] ;
default impl for Object: NSCFString
implementation for Null: NSNull
рдФрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХрдо рд╕реЗ рдХрдо рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реНрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд▓реЗрдЦ рдореЗрдВ рдмрд╣реБрдд рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдордиреЗ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдЫрд╡рд┐ рдорд┐рд▓рд╛рди рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЦреМрдлрдирд╛рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде) рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред
рд╕реНрдкрд╖реНрдЯ minuses - рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ "рдЫрд╡рд┐рдпреЛрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЙрдкрдпреЛрдЧреА рдерд╛ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдХреНрд░рдо рдХреЗ рдЬрд╛рджреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереАред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд░рд╛рдд рдХреЗ рд▓рд┐рдП рдЖрдХрд░реНрд╖рдХ рдкрдарди рд╡рд┐рд╖рдп:
рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд░рдирдЯрд╛рдЗрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧрд╛рдЗрдбрдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд░рдирдЯрд╛рдЗрдо рд╕рдВрджрд░реНрдн