You are on page 1of 4

Ngy 21 thng 1 nm 2014

Nhng mo lp trnh vi Objective-C phn 2 - Blog k thut my tnh

Blog k thut my tnh


k thut my tnh Blog Archives Facebook RSS

Nhng Mo Lp Trnh Vi Objective-C Phn 2


Tip theo phn trc, trong bi vit ny s gii thiu 1 k thut khc trong Objective C: Swizzling method.

Swizzling
Thng thng, khi mun thm vo 1 class c sn 1 vi hm mi, chng ta c th dng C a t e g o r i e s , c bit l cc class ca th vin (ko c source code) nh NSArray, NSDictionary Tuy nhin, cch dng C a t e g o r i e sc 1 hn ch l bn khng th override cc hm c sn. Vy y chnh l l do chng ta cn s dng n Swizzling method. Trong Objective C, khi bn vit 1 on code
1[ s e l fp r e s e n t V i e w C o n t r o l l e r : m a i l C o n t r o l l e ra n i m a t e d : Y E Sc o m p l e t i o n : n i l ] ;

bn khng thc s gi n hm p r e s e n t V i e w C o n t r o l l e r : a n i m a t e d : c o m p l e t i o n :m thay vo l gi i 1 message p r e s e n t V i e w C o n t r o l l e r : a n i m a t e d : c o m p l e t i o n : . Trong qu trnh chy, object s tm kim method tng ng da vo id ca message ny. Chng ta c th da vo swizzling thay i cch object tm kim method tng ng ny:
1 S E Lf i r s t M e t h o d S e l e c t o r=@ s e l e c t o r ( f i r s t M e t h o d ) ; 2 S E Ls e c o n d M e t h o d S e l e c t o r=@ s e l e c t o r ( s e c o n d M e t h o d ) ; 3 M e t h o df i r s t M e t h o d=c l a s s _ g e t I n s t a n c e M e t h o d ( s e l f ,f i r s t M e t h o d S e l e c t o r ) ; 4 M e t h o ds e c o n d M e t h o d=c l a s s _ g e t I n s t a n c e M e t h o d ( s e l f ,s e c o n d M e t h o d S e l e c t o r ) ; 5 6 B O O Lm e t h o d A d d e d=c l a s s _ a d d M e t h o d ( [ s e l fc l a s s ] , 7 f i r s t M e t h o d S e l e c t o r , 8 m e t h o d _ g e t I m p l e m e n t a t i o n ( s e c o n d M e t h o d ) , 9 m e t h o d _ g e t T y p e E n c o d i n g ( s e c o n d M e t h o d ) ) ; 1 0 1 1i f( m e t h o d A d d e d ){ 1 2c l a s s _ r e p l a c e M e t h o d ( [ s e l fc l a s s ] , 1 3 s e c o n d M e t h o d S e l e c t o r , 1 4 m e t h o d _ g e t I m p l e m e n t a t i o n ( f i r s t M e t h o d ) , 1 5 m e t h o d _ g e t T y p e E n c o d i n g ( f i r s t M e t h o d ) ) ; 1 6} e l s e{ 1 7 m e t h o d _ e x c h a n g e I m p l e m e n t a t i o n s ( f i r s t M e t h o d ,s e c o n d M e t h o d ) ; 1 8}

i tng bc cho on code trn: 1. Trc ht chng ta to ra cc selectors (SEL): f i r s t M e t h o d S e l e c t o rv s e c o n d M e t h o d S e l e c t o r 2. Ly ra cc hm tng ng vi selectors gn vo f i r s t M e t h o dv s e c o n d M e t h o dMethod
http://ktmt.github.io/blog/2013/09/17/nhung-meo-lap-trinh-voi-objective-c-phan-2/ 1/4

Ngy 21 thng 1 nm 2014

Nhng mo lp trnh vi Objective-C phn 2 - Blog k thut my tnh

3. Thm vo class nh ngha ca method th 2 di cch gi ca method th nht. Trng hp ny xy ra khi method th nht khng thc s tn ti (trong 1 kh nng no ) 4. Nu iu ny xy ra, chng ta cn 1 nh ngha cho selector ca method th 2, v vy thay th n bng implementation ca method th nht (rng) 5. Nu khng xy ra, ngha l method th nht c tn ti, chng ta thay i implementation ca 2 method.

V d 1
Khi s dng Google Analystics, chng ta mun track page view cho tt c cc UIViewController trong project, tuy nhin, nu class no cng gi hm t r a c k V i e w : < c l a s s _ n a m e >th tng i nhiu, m c th cn b st. Vy cch n gin nht l override li hm v i e w D i d L o a dca U I V i e w C o n t r o l l e r , trong chng ta thc hin t r a c k V i e whoc gi 1 hm khc bt k, tu theo mc ch ca mnh. Chng ta vit phn code trn trong C a t e g o r i e sca N S O b j e c t , t c th gi n t bt k class no:
1 # i m p o r t" N S O b j e c t + S w i z z l e . h " 2 # i m p o r t< o b j c / r u n t i m e . h > 3 4 @ i m p l e m e n t a t i o nN S O b j e c t( S w i z z l e ) 5 6 +( v o i d )s w i z z l e I n s t a n c e S e l e c t o r : ( S E L ) o r i g i n a l S e l e c t o r 7 w i t h N e w S e l e c t o r : ( S E L ) n e w S e l e c t o r 8 { 9 M e t h o do r i g i n a l M e t h o d=c l a s s _ g e t I n s t a n c e M e t h o d ( s e l f ,o r i g i n a l S e l e c t o r ) ; 1 0 M e t h o dn e w M e t h o d=c l a s s _ g e t I n s t a n c e M e t h o d ( s e l f ,n e w S e l e c t o r ) ; 1 1 1 2 B O O Lm e t h o d A d d e d=c l a s s _ a d d M e t h o d ( [ s e l fc l a s s ] , 1 3 o r i g i n a l S e l e c t o r , 1 4 m e t h o d _ g e t I m p l e m e n t a t i o n ( n e w M e t h o d ) , 1 5 m e t h o d _ g e t T y p e E n c o d i n g ( n e w M e t h o d ) ) ; 1 6 1 7 i f( m e t h o d A d d e d ){ 1 8 c l a s s _ r e p l a c e M e t h o d ( [ s e l fc l a s s ] , 1 9 n e w S e l e c t o r , 2 0 m e t h o d _ g e t I m p l e m e n t a t i o n ( o r i g i n a l M e t h o d ) , 2 1 m e t h o d _ g e t T y p e E n c o d i n g ( o r i g i n a l M e t h o d ) ) ; 2 2 }e l s e{ 2 3 m e t h o d _ e x c h a n g e I m p l e m e n t a t i o n s ( o r i g i n a l M e t h o d ,n e w M e t h o d ) ; 2 4 } 2 5} 2 6 2 7@ e n d

By gi to tip C a t e g o r i e scho UIViewController:


1 # i m p o r t" U I V i e w C o n t r o l l e r +S w i z z l i n g . h " 2 # i m p o r t" N S O b j e c t + S w i z z l e . h " 3 4 @ i m p l e m e n t a t i o nU I V i e w C o n t r o l l e r( S w i z z l i n g ) 5 6 +( v o i d ) l o a d{ 7 s t a t i cd i s p a t c h _ o n c e _ to n c e T o k e n ; 8 d i s p a t c h _ o n c e ( & o n c e T o k e n ,^ { 9 [ s e l fs w i z z l e I n s t a n c e S e l e c t o r : @ s e l e c t o r ( v i e w D i d L o a d ) 1 0 w i t h N e w S e l e c t o r : @ s e l e c t o r ( m y V i e w D i d L o a d ) ] ; 1 1 } ) ; 1 2} 1 3 1 4- ( v o i d )m y V i e w D i d L o a d{ 1 5 N S L o g ( @ " T h i si sm yv i e wd i dl o a d " ) ; 1 6 1 7 / /T r a c kG o o g l eA n a l y s t i ch e r e 1 8 1 9 [ s e l fm y V i e w D i d L o a d ] ; 2 0 2 1}

http://ktmt.github.io/blog/2013/09/17/nhung-meo-lap-trinh-voi-objective-c-phan-2/

2/4

Ngy 21 thng 1 nm 2014

Nhng mo lp trnh vi Objective-C phn 2 - Blog k thut my tnh

Khi Objective-C run-time load 1 category, n s gi n hm l o a d . Chng ta s dng dispatch_once chc chn rng hm swizzle ch c gi 1 ln. Sau khi import category ny, (tt nht l trong file prefix - pch) tt c cc hm v i e w D i d L o a dca U I V i e w C o n t r o l l e rs c thay th bng hm m y V i e w D i d L o a d .

V d 2
1 ng dng khc ca swizzling method l khi debug li i n d e xo u to fr a n g eca NSArray. Nhiu khi gp phi li ny nhng chng trnh khng dng li ng on code b li (nhy ra hm main). 1 cch n gin x l trng hp ny l override hm o b j e c t A t I n d e x :ca NSArray v bt exception trong . Tuy nhin, cch s dng swizzling method y c hi khc 1 cht. Trc ht l to C a t e g o r ycho N S A r r a y :
1 @ i m p l e m e n t a t i o nN S A r r a y( O u t O f R a n g e ) 2 3 ( v o i d ) s a f e O b j e c t A t I n d e x : ( N S U I n t e g e r ) i n d e x{ 4 i f( i n d e x> =s e l f . c o u n t ){ 5 N S L o g ( @ " % ss e l f=% @ ,p o i n t e r=% p ,i n d e x=% l u " ,_ _ F U N C T I O N _ _ ,s e l f ,s e l f ,( u n s i g n e dl o n g ) i n d e x ) ; 6 } 7 [ s e l fs a f e O b j e c t A t I n d e x : i n d e x ] ; 8 } 9 1 0@ e n d

t 1 breakpoint vo trong iu kin i f( i n d e x> =s e l f . c o u n t ) c th bit c li n t u. Sau , trong hm m a i nca m a i n . m , thc hin exchange method:
1 # i m p o r t< o b j c / r u n t i m e . h > 2 # i m p o r t" N S A r r a y + O u t O f R a n g e . h " 3 4 i n tm a i n ( i n ta r g c ,c h a r* a r g v [ ] ) 5 { 6 C l a s sa r r a y C l a s s=N S C l a s s F r o m S t r i n g ( @ " _ _ N S A r r a y M " ) ; 7 M e t h o do r i g i n a l M e t h o d=c l a s s _ g e t I n s t a n c e M e t h o d ( a r r a y C l a s s ,@ s e l e c t o r ( o b j e c t A t I n d e x : ) ) ; 8 M e t h o dc a t e g o r y M e t h o d=c l a s s _ g e t I n s t a n c e M e t h o d ( [ N S A r r a yc l a s s ] ,@ s e l e c t o r ( s a f e O b j e c t A t I n d e x : ) ) ; 9 m e t h o d _ e x c h a n g e I m p l e m e n t a t i o n s ( o r i g i n a l M e t h o d ,c a t e g o r y M e t h o d ) ; 1 0 1 1 N S A u t o r e l e a s e P o o l*p o o l=[ [ N S A u t o r e l e a s e P o o la l l o c ]i n i t ] ; 1 2 i n tr e t V a l=U I A p p l i c a t i o n M a i n ( a r g c ,a r g v ,n i l ,n i l ) ; 1 3 [ p o o lr e l e a s e ] ; 1 4 r e t u r nr e t V a l ; 1 5}

Lu y chng ta gi Class a r r a y C l a s s=N S C l a s s F r o m S t r i n g ( @ " _ _ N S A r r a y M " ) ;l bi v hm o b j e c t A t I n d e x :khng n t N S A r r a y class m n t _ _ N S A r r a y M(xem trn console debug). Chnh v th chng ta khng th s dng cch swizzle thng thng nh trong v d 1. test on code ny, trong 1 on chng trnh bt k, to ra 1 bug:
1N S M u t a b l e A r r a y* l i s t=[ N S M u t a b l e A r r a ya r r a y W i t h O b j e c t s : @ " 1 " ,@ " 2 " ,n i l ] ; 2N S L o g ( @ " T e s t :% @ " ,[ l i s to b j e c t A t I n d e x : 3 ] ) ;

By gi, chy chng trnh v tn hng thnh qu :)


Thch 1 Tw eet 0 2

Comments

http://ktmt.github.io/blog/2013/09/17/nhung-meo-lap-trinh-voi-objective-c-phan-2/

3/4

Ngy 21 thng 1 nm 2014

Nhng mo lp trnh vi Objective-C phn 2 - Blog k thut my tnh


0

1 comment Join the discussion


Best Ky Thuat May Tinh Thng Si
2 months ago

Share

Login

Good
Reply Share

ALSO ON KY THUAT MAY TINH

WHAT'S THIS?

H thng sinh 64 bit unique ID - Blog k thut my tnh


1 comment 8 months ago

Gii thiu mt s storage engine ca Mysql - Blog k thut my tnh


1 comment 9 months ago

Khang Ty vo ng dng cn ID ntn na :).Ch ny:

curr_time = int(time() * 1000) sao ko l milisecond ca system lun tc gi i. Second*1000 = milisecond gi Vi li

kiennt 1. "MyISAM lock ton b table. User (MySQL server)

chim shared-lock khi c v chim exclusive-lock khi ghi. Tuy vy, vic c ghi c th din ra ng thi!" Bn c th gii

ngha ca t kha volatile trong C - Blog k thut my tnh


2 comments 9 months ago

S dng unittest refactoring code - Blog k thut my tnh


1 comment 8 months ago

kiennt Done!!!

Vu Nhat Minh T ngh don init mock Object nn vit ra hm

ring cho tch bch v d hiu hn :D https://gist.github.com/DTVD/5...

Subscribe

Add Disqus to your site

Copyright 2014 k thut my tnh

http://ktmt.github.io/blog/2013/09/17/nhung-meo-lap-trinh-voi-objective-c-phan-2/

4/4

You might also like