From 79a131777c4c1abb6b362075bebd54fac5f2a684 Mon Sep 17 00:00:00 2001 From: huangyibiao Date: Wed, 13 Jan 2016 20:12:30 +0800 Subject: [PATCH] add demos --- RuntimeDemo.xcodeproj/project.pbxproj | 10 ++++ .../UserInterfaceState.xcuserstate | Bin 39594 -> 39319 bytes RuntimeDemo/HDFArchiveModel.m | 1 + RuntimeDemo/HYBMethodExchange.m | 3 ++ RuntimeDemo/HYBMsgSend.m | 7 ++- RuntimeDemo/HYBPropertyLearn.m | 3 +- RuntimeDemo/HYBTestModel.m | 3 +- RuntimeDemo/Info.plist | 5 ++ RuntimeDemo/NSArray+Swizzling.m | 22 ++++---- RuntimeDemo/NSMutableArray+Swizzling.m | 51 ++++++++++-------- RuntimeDemo/NSObject+Swizzling.m | 5 +- RuntimeDemo/UIViewController+Swizzling.h | 13 +++++ RuntimeDemo/UIViewController+Swizzling.m | 42 +++++++++++++++ RuntimeDemo/ViewController.m | 23 ++++++-- 14 files changed, 144 insertions(+), 44 deletions(-) create mode 100644 RuntimeDemo/UIViewController+Swizzling.h create mode 100644 RuntimeDemo/UIViewController+Swizzling.m diff --git a/RuntimeDemo.xcodeproj/project.pbxproj b/RuntimeDemo.xcodeproj/project.pbxproj index d5693c3..b64fed7 100644 --- a/RuntimeDemo.xcodeproj/project.pbxproj +++ b/RuntimeDemo.xcodeproj/project.pbxproj @@ -34,6 +34,9 @@ 69657DE41C44DB520095C032 /* NSObject+Swizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = 69657DE31C44DB520095C032 /* NSObject+Swizzling.m */; }; 69657DE51C44DB520095C032 /* NSObject+Swizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = 69657DE31C44DB520095C032 /* NSObject+Swizzling.m */; }; 69657DE61C44DB520095C032 /* NSObject+Swizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = 69657DE31C44DB520095C032 /* NSObject+Swizzling.m */; }; + 69657E2D1C46402D0095C032 /* UIViewController+Swizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = 69657E2C1C46402D0095C032 /* UIViewController+Swizzling.m */; }; + 69657E2E1C46402D0095C032 /* UIViewController+Swizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = 69657E2C1C46402D0095C032 /* UIViewController+Swizzling.m */; }; + 69657E2F1C46402D0095C032 /* UIViewController+Swizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = 69657E2C1C46402D0095C032 /* UIViewController+Swizzling.m */; }; 697364B11C3A461F003E1FE9 /* HYBMethodExchange.m in Sources */ = {isa = PBXBuildFile; fileRef = 697364B01C3A461F003E1FE9 /* HYBMethodExchange.m */; }; 697364B21C3A461F003E1FE9 /* HYBMethodExchange.m in Sources */ = {isa = PBXBuildFile; fileRef = 697364B01C3A461F003E1FE9 /* HYBMethodExchange.m */; }; 697364B31C3A461F003E1FE9 /* HYBMethodExchange.m in Sources */ = {isa = PBXBuildFile; fileRef = 697364B01C3A461F003E1FE9 /* HYBMethodExchange.m */; }; @@ -106,6 +109,8 @@ 69657DDE1C44D8620095C032 /* NSArray+Swizzling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Swizzling.m"; sourceTree = ""; }; 69657DE21C44DB520095C032 /* NSObject+Swizzling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+Swizzling.h"; sourceTree = ""; }; 69657DE31C44DB520095C032 /* NSObject+Swizzling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+Swizzling.m"; sourceTree = ""; }; + 69657E2B1C46402D0095C032 /* UIViewController+Swizzling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+Swizzling.h"; sourceTree = ""; }; + 69657E2C1C46402D0095C032 /* UIViewController+Swizzling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+Swizzling.m"; sourceTree = ""; }; 697364AF1C3A461F003E1FE9 /* HYBMethodExchange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HYBMethodExchange.h; sourceTree = ""; }; 697364B01C3A461F003E1FE9 /* HYBMethodExchange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HYBMethodExchange.m; sourceTree = ""; }; 6980598B1C30D6070021085B /* HYBTestModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HYBTestModel.h; sourceTree = ""; }; @@ -259,6 +264,8 @@ 69657DDE1C44D8620095C032 /* NSArray+Swizzling.m */, 69657DE21C44DB520095C032 /* NSObject+Swizzling.h */, 69657DE31C44DB520095C032 /* NSObject+Swizzling.m */, + 69657E2B1C46402D0095C032 /* UIViewController+Swizzling.h */, + 69657E2C1C46402D0095C032 /* UIViewController+Swizzling.m */, ); name = MethodExchange; sourceTree = ""; @@ -508,6 +515,7 @@ 69654F931C30214500FFB5AC /* UIControl+HYBBlock.m in Sources */, 69E0205C1C3771AF0034BF32 /* HYBMsgSend.m in Sources */, 691D6FC51C421E68003D41FB /* HYBPropertyLearn.m in Sources */, + 69657E2D1C46402D0095C032 /* UIViewController+Swizzling.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -525,6 +533,7 @@ 691D6FC61C421E68003D41FB /* HYBPropertyLearn.m in Sources */, 698828361C34D476002363D5 /* HYBPig.m in Sources */, 697364B21C3A461F003E1FE9 /* HYBMethodExchange.m in Sources */, + 69657E2E1C46402D0095C032 /* UIViewController+Swizzling.m in Sources */, 698828311C34CBAB002363D5 /* HYBDog.m in Sources */, 6980598E1C30D6070021085B /* HYBTestModel.m in Sources */, 69657DE01C44D8620095C032 /* NSArray+Swizzling.m in Sources */, @@ -546,6 +555,7 @@ 691D6FC71C421E68003D41FB /* HYBPropertyLearn.m in Sources */, 698828371C34D476002363D5 /* HYBPig.m in Sources */, 697364B31C3A461F003E1FE9 /* HYBMethodExchange.m in Sources */, + 69657E2F1C46402D0095C032 /* UIViewController+Swizzling.m in Sources */, 698828321C34CBAB002363D5 /* HYBDog.m in Sources */, 6980598F1C30D6070021085B /* HYBTestModel.m in Sources */, 69657DE11C44D8620095C032 /* NSArray+Swizzling.m in Sources */, diff --git a/RuntimeDemo.xcworkspace/xcuserdata/huangyibiao.xcuserdatad/UserInterfaceState.xcuserstate b/RuntimeDemo.xcworkspace/xcuserdata/huangyibiao.xcuserdatad/UserInterfaceState.xcuserstate index d4e7cb3f6cbacea79827506f5f347dcb73275a04..f48234989f6a384513a7dfdfa9a7fd66643af6ea 100644 GIT binary patch literal 39319 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 N;Nq{F=FFLM&YYP! zQ`KzHn=P@iZ&QfE6iqRdh!Q)bIiwc{Pu7{tdSg>@u(7IMr?r?%f;A>>ogTi<54ISa z`%&ormD`=^5tM|IQZAG$s-yH&J=H)Ns79)ZGE&V{3)Ml*q!v&QQA?@Esp-@c)H-Stbsx2v+D2`sc2c{j zz0^VK5cMMUGIg9fNxem#p+2NOqQ0QMq`srBP~THOP(LFnk|7p3AV=hc`k=l@js_q< zG_C>Q0U0#t~~kQ!B?8dQtS$bwqYWYmUc zp!?8FbU&Jf9z+kJh3FCV1bPy!M61whv>9zdThVs31MNY3(E)TAy@*~xC()be6nYQ6 zkItb_(RuVO`VL(|zo1{S1WU0Dv)BPU;{Mnd55Rud9|zz-9F7O#I2@0acrYGkOui_KsI-jnjHFOoNrK{~NpP-+l*U_8lXXu^uE_ye;hdx938UN=`-|M`aSw1`ZK1Pu`sPn2Q!7amzl=QVD4jPGY>HHnEA{iW-+srd6Zef zJkG3QRx|6F4a^p1E3<=nn%T|lVfHfznCF=nn4`=~%rWLQ<_+c~^A__qbC!9J`H=aD z`HcCT`HH!~Tw*RW-!nfjKQq^u-q9{?cC|;x#C5uu-LqtPG>7oqL2+>H<7|~c!u4tmDKvXDFiAqIkQKhI_q!Z~y z^`a(`QDhcbMD3yu(NxjBqUoX;qFJKZqPe1ZqJ^SGqDMqaMaxAiL@PzBMC(NBMVm!i zMB7C>M7u=0Mf*hiMTbPsi;jqnie42R6TKsPS9C^nR`j0eebG752ciq2uSMU8E{ZOR zE{nbueJA=|^oQuW=!V!)>?D?poyGmcE@D5izc@e~D2^7#h-1ZZ;-TVU;^E>nak@A| zoGH!{=ZYtaCyDdKYH_7lBd!uRiH+iBaf^7W_+IfeF(;lYo+q9!ULamBULk&5{DgS3 zc#C+e_$l!|@qY0E@pIx=#mB_2iI0oVh|h}O6TdG$FaAn=LHv{Ws`zK|H3=_GEKrsh-98*zGQ*qA;}8K3Hb`X|A+PS}v`Ss-+E5gS1iFB%LDdl-?tqDt$oupmdIOu5_MszI1`~ zA?XU~^D}*%2<|lU>#W}wh!Bvbz|LG z4>pJmW<%IeHjE8t2eMIYG#k&Ru&L}Ic04En!t`DXU{^ z*jl!ZZDyyio$NjARQ6tW8q2W{vUAwE>^ycU`zX7NeT-epu46Z`Pq7EtL+tbH3+!R` zCH7VJ82cJ~oIS~2VSi$;vcIywu{YS84zvT~Aa#&AI63rj=;z?#;Njru(BHw=A;2Nf zA=DwvA;KZjA=V+zA<-epVUWXMhv5amO|1sQTa=7qDF@1t>Pz)28lM;4pzAQJ;NLDw zRv4@`Xw2r-loQp5!yLVul2gtc!~Mjm)bil$j1h53naa4Rgv{8CsDy;%*r<%``0S_= zBjU2Mm08NH5n0)4xob{Vc9GH4U~blEby-GjYoo5oVyoDl8bF0^pgbr~%8T-*e5n4E zFDK%}oP?8dGLGdOHc)<)KNSEJcu>Jq204TLIn~fieT^Q-ko!ULbgczEg5D9; za<6VG@{LAAmBy4~F4UX#RR$o)^VTy>RYs3THYUbUgQ(EWR4f%o#ZyWufl8#3sAMXI zO68omK3rc;&N*}aI2X>9bK~4MQ-gt#L#biZa4L;Tr$VSqDvR>~c6xF1xh32e+_%8k z@40BMwiIfHrjONB=?rSQ9RA9yGq#P_OxD+GEJjl~e34zPhfnDyoklH>;t93&v>nR| zEP8|9(!m$Y13$`AsMoa#fZbpMgdJn;AhL93eQlE+LKzQ}rK@VKt>w9Fqfe+zuQT&q z3m7Bx23@YkQm2-?r<={-#A%u=0@>!Vnhs;D1zsIhk}*zasWVoO)oDyk(Ty@2Z}X^f zDs&T-PZdywR1sB7l~5|Glq%!AIUlY+=gSS?{5XFufD7D2RZwc+Y!>{drK%|%70d;3 zLx8W*@LxT5A2$;|*QyNGI`d6B=vwz~4vsTc>(qHbTD8Vh%`=wgv_K^cp+dpK6#mX@ zt!jkQD&a5di*gruBTHAKX*F1^3=z2L-}O~4|GL=%0y#<7Y|@$GgT?|LD@d}ljekA+ zg|FN8J&*J@WunZK1r$XqHJNIo+ST%YCZo|Ju#a!bc%FQ@N3E_&-)a^J;|GMU-6A~k zY&Pi|HKvX~J>pV0iVNljze`P_I-!DlsHxPwP)RFAz_p!0-B%2rw4vIhYbtEkz;8>b zmd9KDX6hVt(8R;x5lv`Lr|hoqi?$PH9vTps&(xXYHaV`dd4MiVO%m7%0;W? zF~wS7QZ#gwAoD>rDRcmQA=}ucU^Fr#8wbUYNG4(LDgbU{)xfm{v zQ@%w#N-YEGAETC2D^$1YE3i_+4dfJDL@!c(ntGC2Nv)z*s|3B?1PZTM_^1O}=nu5r z;v*2EZ>qHd=4$k&)zlhl?Y}8gJU(xNbqZvoZ#|5K68LtmxW7-PnD}TU}r;%B!iDc)0(#y#0`R z1qKy?S>j~sJ}wnT!XSP_mDS{?>Ob&I5(9=0Fzs{sUP`cI1s zHM~u|qm~E#2Q{pw-sRE%lcF|#eU^Hk3SC9L#|>RYo#Te_4nl~abh>o?ophlM;A84j z9^eyh_$ul%E{&_r9|yzT_VhgU4b^WA^%Zr2`kG7UGPuk&)J2fh%Ul-7Y8~$u4YaEc zRJui%2Ntub*7`9^4}O5LNdsC5Mx2{{S)BpG2fFIpzaObHHtH;<4xzt(~xUm}$g%HAsrXE8gB<99(}D&u!lrpj@C?KSigu_*a`PYJ;vRaIoDwCcZ>xQfhLfe_YDc z+a8+XVcf0qQ>||f6uuB%jE(e9PD-}D$Cr;C%uclqTojH5s^xvh=Z$N%@RnAv5NqIT z1+^A*zwmcZ`g7T$=#1?}($dbjgoFgZi%pqY(ixW;8z1Q(+XWSi;>yP7b&rOQ)hL!) z+rua$B}x#CGFQcw2{zO!|0oqKA{vASqakQ0SI$*%YOeA&izpaCn=R>Kglu2+us&U1 zp|Mtrqq*JU*x44riWEdxz^JI@q1^_3jNTG0j2fFrMdw+?l^43VP!aTeF*O;fsQvsL zt4d?mmBPO!odH~o$vRNRHC&>=;c`?_Fg_0k!D>`atrfnjMBrPybaVX{&(@$yo@)YI zw4fGHHK*s4;4gM|LN~@vjr8wKjfGFjl=!JrZ9}IHHBzB#ksj5f24vtGI0M(nHLXQW z$cUOz3uok7Il@inYKzC}YPvjiH&E8y4q~^1sS;Ew?}3&~(%05m3)`w`M^pJ~I?xo< ziSFT=xfagEnb*Q}BMWih8W#blExbdlmirWfI^+ck<~+JK-uX07(zF$74Aw#DZU3}u zY~^Wa)}(KSi3tp1ce^51bY9H~T$@cjva(x|qB&?D=zcVpo4g9m z=h}GMoWZVlx19Ia%)*O{(2~_?F?yJ5=caO;t)@uWM$6F(u9Lfm zQL#s0Pw|eD9NR#jMmzbIKEuse1(QFR>Oo7vVK*BMI+*b%}e2-4Nh%Rvpxka2RHz@0;(@Pq!8Q8Hzs4se;lP z>?!ySQ&i|W^gH?kT}L<2P3{qHDfcM1jC*VyMi^rnGg!ne=bq(W;@;-o;aTc$r(e1! z%F&=^g&D$~i)3gl+PV=C)c}Y64k%WBL9g44RX4s`?t6z<1hd%1Q|yFYsnGSf5AKWQ z*ctc3F5C+4aqbE3Np2;#YCU$t?%0D0!C;KJ)!Yv5X&CZ*;D2Zt9}>!LZ-&XPuG%`L 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 Dn~y-= diff --git a/RuntimeDemo/HDFArchiveModel.m b/RuntimeDemo/HDFArchiveModel.m index 92694dc..00463f9 100644 --- a/RuntimeDemo/HDFArchiveModel.m +++ b/RuntimeDemo/HDFArchiveModel.m @@ -81,6 +81,7 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder { NSString *firstLetter = [NSString stringWithFormat:@"%c", [setterName characterAtIndex:0]]; setterName = [setterName substringFromIndex:1]; setterName = [NSString stringWithFormat:@"%@%@", firstLetter.uppercaseString, setterName]; + // [setterName stringByReplacingCharactersInRange:NSMakeRange(0, 0) withString:firstLetter.uppercaseString]; } diff --git a/RuntimeDemo/HYBMethodExchange.m b/RuntimeDemo/HYBMethodExchange.m index 42a34bd..6c26070 100644 --- a/RuntimeDemo/HYBMethodExchange.m +++ b/RuntimeDemo/HYBMethodExchange.m @@ -39,6 +39,9 @@ + (void)test { NSString *nilStr = nil; NSArray *array1 = @[@"ara", @"sdf", @"dsfdsf", nilStr]; NSLog(@"array1.count = %lu", array1.count); + + // 测试数组中有数组 + NSArray *array2 = @[@[@"12323", @"nsdf", nilStr], @[@"sdf", @"nilsdf", nilStr, @"sdhfodf"]]; } // C语言版 diff --git a/RuntimeDemo/HYBMsgSend.m b/RuntimeDemo/HYBMsgSend.m index 0c17084..4144733 100644 --- a/RuntimeDemo/HYBMsgSend.m +++ b/RuntimeDemo/HYBMsgSend.m @@ -44,17 +44,20 @@ - (float)returnFloatType { - (CGRect)returnTypeIsStruct { NSLog(@"%s was called", __FUNCTION__); - + return CGRectMake(0, 0, 10, 10); } + (void)test { // 1.创建对象 HYBMsgSend *msg = ((HYBMsgSend * (*)(id, SEL))objc_msgSend)((id)[HYBMsgSend class], @selector(alloc)); + // 2.初始化对象 msg = ((HYBMsgSend * (*)(id, SEL))objc_msgSend)((id)msg, @selector(init)); + // 3.调用无参数无返回值方法 ((void (*)(id, SEL))objc_msgSend)((id)msg, @selector(noArgumentsAndNoReturnValue)); + // 4.调用带一个参数但无返回值的方法 ((void (*)(id, SEL, NSString *))objc_msgSend)((id)msg, @selector(hasArguments:), @"带一个参数,但无返回值"); // 5.调用带返回值,但是不带参数 @@ -62,7 +65,7 @@ + (void)test { NSLog(@"5. 返回值为:%@", retValue); // 6.带参数带返回值 int returnValue = ((int (*)(id, SEL, NSString *, int)) - objc_msgSend)((id)msg, + objc_msgSend)(msg, @selector(hasArguments:andReturnValue:), @"参数1", 2016); diff --git a/RuntimeDemo/HYBPropertyLearn.m b/RuntimeDemo/HYBPropertyLearn.m index a5c0fab..a911822 100644 --- a/RuntimeDemo/HYBPropertyLearn.m +++ b/RuntimeDemo/HYBPropertyLearn.m @@ -14,12 +14,13 @@ @implementation HYBPropertyLearn - (void)getAllProperties { unsigned int outCount = 0; + // Ivar objc_property_t *properties = class_copyPropertyList(self.class, &outCount); for (unsigned int i = 0; i < outCount; ++i) { objc_property_t property = properties[i]; const char *propertyName = property_getName(property); - + const char *propertyAttributes = property_getAttributes(property); NSLog(@"%s %s", propertyName, propertyAttributes); diff --git a/RuntimeDemo/HYBTestModel.m b/RuntimeDemo/HYBTestModel.m index 3286bf7..60f9396 100644 --- a/RuntimeDemo/HYBTestModel.m +++ b/RuntimeDemo/HYBTestModel.m @@ -31,12 +31,13 @@ - (instancetype)initWithDictionary:(NSDictionary *)dictionary { } } } - + return self; } - (NSDictionary *)toDictionary { unsigned int outCount = 0; + objc_property_t *properties = class_copyPropertyList([self class], &outCount); if (outCount != 0) { diff --git a/RuntimeDemo/Info.plist b/RuntimeDemo/Info.plist index 6905cc6..65ca776 100644 --- a/RuntimeDemo/Info.plist +++ b/RuntimeDemo/Info.plist @@ -22,6 +22,11 @@ 1 LSRequiresIPhoneOS + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/RuntimeDemo/NSArray+Swizzling.m b/RuntimeDemo/NSArray+Swizzling.m index 2dcba77..0565d66 100644 --- a/RuntimeDemo/NSArray+Swizzling.m +++ b/RuntimeDemo/NSArray+Swizzling.m @@ -12,18 +12,22 @@ @implementation NSArray (Swizzling) -//+ (void)load { -// static dispatch_once_t onceToken; -// dispatch_once(&onceToken, ^{ -// [self swizzleSelector:@selector(lastObject) -// withSwizzledSelector:@selector(hdf_lastObject)]; -// }); -//} ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self swizzleSelector:@selector(lastObject) + withSwizzledSelector:@selector(hdf_lastObject)]; + }); +} - (id)hdf_lastObject { - NSLog(@"%s", __FUNCTION__); + if (self.count == 0) { + NSLog(@"%s 数组为空,直接返回nil", __FUNCTION__); + + return nil; + } - return [self hdf_lastObject]; + return [self hdf_lastObject]; } diff --git a/RuntimeDemo/NSMutableArray+Swizzling.m b/RuntimeDemo/NSMutableArray+Swizzling.m index 98950d6..c806659 100644 --- a/RuntimeDemo/NSMutableArray+Swizzling.m +++ b/RuntimeDemo/NSMutableArray+Swizzling.m @@ -12,46 +12,52 @@ @implementation NSMutableArray (Swizzling) -//+ (void)load { -// static dispatch_once_t onceToken; -// dispatch_once(&onceToken, ^{ -// [self swizzleSelector:@selector(removeObject:) -// withSwizzledSelector:@selector(hdf_safeRemoveObject:)]; -// -// [objc_getClass("__NSArrayM") swizzleSelector:@selector(addObject:) -// withSwizzledSelector:@selector(hdf_safeAddObject:)]; -// [objc_getClass("__NSArrayM") swizzleSelector:@selector(removeObjectAtIndex:) -// withSwizzledSelector:@selector(hdf_safeRemoveObjectAtIndex:)]; -// -// [objc_getClass("__NSArrayM") swizzleSelector:@selector(insertObject:atIndex:) -// withSwizzledSelector:@selector(hdf_insertObject:atIndex:)]; -// -// [objc_getClass("__NSPlaceholderArray") swizzleSelector:@selector(initWithObjects:count:) withSwizzledSelector:@selector(hdf_initWithObjects:count:)]; -// -// [objc_getClass("__NSArrayM") swizzleSelector:@selector(objectAtIndex:) withSwizzledSelector:@selector(hdf_objectAtIndex:)]; -// }); -//} ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self swizzleSelector:@selector(removeObject:) + withSwizzledSelector:@selector(hdf_safeRemoveObject:)]; + + [objc_getClass("__NSArrayM") swizzleSelector:@selector(addObject:) + withSwizzledSelector:@selector(hdf_safeAddObject:)]; + [objc_getClass("__NSArrayM") swizzleSelector:@selector(removeObjectAtIndex:) + withSwizzledSelector:@selector(hdf_safeRemoveObjectAtIndex:)]; + + [objc_getClass("__NSArrayM") swizzleSelector:@selector(insertObject:atIndex:) + withSwizzledSelector:@selector(hdf_insertObject:atIndex:)]; + + [objc_getClass("__NSPlaceholderArray") swizzleSelector:@selector(initWithObjects:count:) withSwizzledSelector:@selector(hdf_initWithObjects:count:)]; + + [objc_getClass("__NSArrayM") swizzleSelector:@selector(objectAtIndex:) withSwizzledSelector:@selector(hdf_objectAtIndex:)]; + }); +} - (instancetype)hdf_initWithObjects:(const id _Nonnull __unsafe_unretained *)objects count:(NSUInteger)cnt { BOOL hasNilObject = NO; for (NSUInteger i = 0; i < cnt; i++) { + if ([objects[i] isKindOfClass:[NSArray class]]) { + NSLog(@"%@", objects[i]); + } if (objects[i] == nil) { + hasNilObject = YES; + NSLog(@"%s object at index %lu is nil, it will be filtered", __FUNCTION__, i); + //#if DEBUG +// // 如果可以对数组中为nil的元素信息打印出来,增加更容易读懂的日志信息,这对于我们改bug就好定位多了 // NSString *errorMsg = [NSString stringWithFormat:@"数组元素不能为nil,其index为: %lu", i]; // NSAssert(objects[i] != nil, errorMsg); //#endif - hasNilObject = YES; - NSLog(@"%s object at index %lu is nil, it will be filtered", __FUNCTION__, i); } } + // 因为有值为nil的元素,那么我们可以过滤掉值为nil的元素 if (hasNilObject) { id __unsafe_unretained newObjects[cnt]; NSUInteger index = 0; for (NSUInteger i = 0; i < cnt; ++i) { if (objects[i] != nil) { - newObjects[index++] = objects[i]; + newObjects[index++] = objects[i]; } } @@ -61,6 +67,7 @@ - (instancetype)hdf_initWithObjects:(const id _Nonnull __unsafe_unretained *)ob return [self hdf_initWithObjects:objects count:cnt]; } + - (void)hdf_safeAddObject:(id)obj { if (obj == nil) { NSLog(@"%s can add nil object into NSMutableArray", __FUNCTION__); diff --git a/RuntimeDemo/NSObject+Swizzling.m b/RuntimeDemo/NSObject+Swizzling.m index 5abdec6..6b59502 100644 --- a/RuntimeDemo/NSObject+Swizzling.m +++ b/RuntimeDemo/NSObject+Swizzling.m @@ -14,13 +14,10 @@ @implementation NSObject (Swizzling) // 全面 + (void)swizzleSelector:(SEL)originalSelector withSwizzledSelector:(SEL)swizzledSelector { Class class = [self class]; - + Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); -// IMP oIMP = class_getMethodImplementation(class, originalSelector); -// IMP nIMP = class_getMethodImplementation(class, swizzledSelector); -// // 若已经存在,则添加会失败 BOOL didAddMethod = class_addMethod(class, originalSelector, diff --git a/RuntimeDemo/UIViewController+Swizzling.h b/RuntimeDemo/UIViewController+Swizzling.h new file mode 100644 index 0000000..41535b7 --- /dev/null +++ b/RuntimeDemo/UIViewController+Swizzling.h @@ -0,0 +1,13 @@ +// +// UIWebView+Swizzling.h +// RuntimeDemo +// +// Created by huangyibiao on 16/1/13. +// Copyright © 2016年 huangyibiao. All rights reserved. +// + +#import + +@interface UIViewController (Swizzling) + +@end diff --git a/RuntimeDemo/UIViewController+Swizzling.m b/RuntimeDemo/UIViewController+Swizzling.m new file mode 100644 index 0000000..49ed5fa --- /dev/null +++ b/RuntimeDemo/UIViewController+Swizzling.m @@ -0,0 +1,42 @@ +// +// UIWebView+Swizzling.m +// RuntimeDemo +// +// Created by huangyibiao on 16/1/13. +// Copyright © 2016年 huangyibiao. All rights reserved. +// + +#import "UIViewController+Swizzling.h" +#import "NSObject+Swizzling.h" + +@implementation UIViewController (Swizzling) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self swizzleSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:) + withSwizzledSelector:@selector(hdf_webView:shouldStartLoadWithRequest:navigationType:)]; + }); +} + +- (BOOL)hdf_webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { + NSString *url = request.URL.absoluteString; + + // 注意containsString是iOS8以后才有,具体要兼容ios6则需要自己写 + // 这里只是为了简便测试 + if ([url containsString:@"userId"] && [url containsString:@"token"]) { + return [self hdf_webView:webView shouldStartLoadWithRequest:request navigationType:navigationType]; + } + + if ([url isEqualToString:@"about:blank"]) { + return [self hdf_webView:webView shouldStartLoadWithRequest:request navigationType:navigationType]; + } + + url = [NSString stringWithFormat:@"%@?userId=123&token=ssdfsfdf", url]; + NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; + [webView loadRequest:req]; + + return NO; +} + +@end diff --git a/RuntimeDemo/ViewController.m b/RuntimeDemo/ViewController.m index 76578fd..90158e4 100644 --- a/RuntimeDemo/ViewController.m +++ b/RuntimeDemo/ViewController.m @@ -16,8 +16,11 @@ #import "HYBMethodExchange.h" #import "HYBPropertyLearn.h" #import "HYBMethodLearn.h" +#import "UIViewController+Swizzling.h" -@interface ViewController () +@interface ViewController () + +@property (nonatomic, strong) UIWebView *webView; @end @@ -33,12 +36,22 @@ - (void)viewDidLoad { // [HYBMsgSend test]; // [HYBMethodExchange test]; // [HYBPropertyLearn test]; - [HYBMethodLearn test]; +// [HYBMethodLearn test]; + [self testWebview]; +} + +- (void)testWebview { + self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; + self.webView.delegate = self; + NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.haodf.com/"]]; + [self.webView loadRequest:req]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. + +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { + NSLog(@"url: %@", request.URL.absoluteString); + + return YES; } @end