Õâ¸öÔÂÒòΪ×éÄÚ
iOS ¹¤³Ìʦ½ôȱ£¬ËùÒÔÁÙʱ¿ÐÆðÁËÁ½Äê¶àû¿´µÄ ObjC Ïà¹ØµÄÄÚÈÝ£¬³äµ±¾È»ð¶ÓÔ±£¬¿Í´®ÁËÒ»°Ñ iOS
¹¤³Ìʦ¡£±»Ö¸ÅɵĵÚÒ»¸öÈÎÎñÊÇÅŲé App iOS °æ±¾´æÔÚµÄÑÏÖØµÄÄÚ´æÐ¹Â©µÄÎÊÌ⣬ÔÒòÊÇ iOS 10
µÄijЩϵͳ bug £¨²Î¿¼ÎÄÕ£ºÁÄÁÄÆ»¹ûµÄBug - iOS 10 nano_free Crash£©µ¼ÖÂÏßÉϳöÏÖÁ˽϶àµÄ
nano_free ºÍ nano_realloc µÄ crash ÎÊÌ⣬¶øÕâЩ crash »á±»´¥·¢µÄ¸ù±¾ÔÒòÔòÊÇ
App µÄÄÚ´æÐ¹Â©ÎÊÌâûÓкܺõÄÖÎÀí¡£
iOS ÄÚ´æÐ¹Â©µÄÔÒòÎ޷ǾÍÊÇÄÇô¼¸¸ö£¬¸ú Android ·Ç³£ÏàËÆ£ºÄ³Ð©ÖØÐͶÔÏó£¨Activity
»òÕß UIViewController£©Ôڸñ»ÊͷŵÄʱºòδÊÍ·Å£¬Ò»Ö±±»ÆäÄÚ²¿µÄ¶ÔÏóËù³ÖÓС£ÅŲéÄÚ´æÐ¹Â©µÄÊÖ¶ÎÔÚ
Android ÉÏÓÐ MAT »òÕß×îÐ嵀 Android Studio£¬ÔÚ iOS ÔòÉÏÖ÷ÒªÒÀÀµ Xcode
ÌṩµÄ Instruments ¹¤¾ß¡£µ«ÊÇÖÚËùÖÜÖª£¬µÈÄãÖªµÀ´æÔÚÄÚ´æÐ¹Â©ÔÙÀ´ÅŲé¾ÍÒѾºÜÍíÁË¡£¶øÇÒÕâЩ¹¤¾ßËäÈ»ºÃÓ㬵«ÊÇÕæµÄÅŲéÆðÀ´»¹ÊÇÏà¶Ô±È½ÏÀ§Äѵģ¬ÒòΪºÜ´óµÄÔÒòÔÚÓÚÄã²¢²»Çå³þ
App µ½µ×ÔÚÄöÒ³Ãæ·¢ÉúÁËй©£¡
ÔÚ Android ÉÏ£¬Square Õâ¼Ò¹«Ë¾ÌṩÁ˷dz£ÓÐÃûµÄ¹¤¾ß£ºleakcanary£¬À´°ïÖú¿ª·¢ÕßÃÇÔÚÈÕ³£¿ª·¢¹ý³ÌÖоÍÄܹ»·¢ÏÖÄÚ´æÐ¹Â©¡£µ«ÔÚ
iOS ÉÏÄØ£¿ÔÚ Google µÄʱºò£¬ÎÒ·¢ÏÖÁËÁ½¸ö¹¤¾ß£¬Ò»¸öÊÇÕâÆªÎÄÕ½«Òª·Òë²¢½éÉÜµÄ Facebook
¿ªÔ´µÄÈý¼þÌ×£¬ÁíÒ»¸öÔòÊǹúÄÚ΢ÐÅÔĶÁÍŶÓ×öµÄ?MLeaksFinder¡£
¹ØÓÚ MLeaksFinder ÕâÀïÓÐÁ½ÆªÆä¹Ù·½ÌṩµÄÎÄÕ½éÉÜ£º
MLeaksFinder£º¾«×¼ iOS ÄÚ´æÐ¹Â¶¼ì²â¹¤¾ß
MLeaksFinder ÐÂÌØÐÔ
¼ò¶øÑÔÖ®£¬MLeaksFinder ʹÓÃÁËÒ»¸ö·Ç³£ tricky µÄ·½·¨À´¼ì²âÄÚ´æÐ¹Â©£ºÍ¨³£Ò»¸ö UIViewController
ÔÚ±» pop Ö®ºó½«»áºÜ¿ì±»ÊÍ·Å£¬¼ÙÉèÔÚ pop 3 ÃëÖÓÖ®ºóÈÔȻûÓб»ÊÍ·Å£¬Ôò¿ÉÒÔÈÏΪÕâ¸ö UIViewController
´æÔÚй©µÄÎÊÌ⣨ÆäʵÀàËÆµÄ·½°¸Í¬ÑùÒ²¿ÉÒÔÔÚ Android ÉÏʵÏÖ£¬¾ÝÎÒËù֪΢ÐÅÔÚÔçÆÚ¾ÍÓÐÀàËÆÔÀíʵÏÖµÄÓÃÔÚ
Android ÉϵÄÄÚ´æÐ¹Â©¼à²â¹¤¾ßÁË£©¡£ÔÚºóÐøµÄ¸üа汾ÖУ¬MLeaksFinder Ò²ÒÀÀµÁË Facebook
µÄ?FBRetainCycleDetector?À´¸¨ÖúÅжÏÄÚ´æÐ¹Â©ÊÇ·ñÊÇÓÉÑ»·ÒýÓÃÒýÆðµÄ¡£
MLeaksFinder µÄÔÀí·Ç³£¼òµ¥µ«ÓÐЧ£¬°ïÖúÎÒÅŲéÁË App ÖдæÔڵIJ»ÉÙÄÚ´æÐ¹Â©ÎÊÌ⣬¶øÇÒ¶ÔÓÚÕû¸öÓ¦Óûù±¾ÁãÇÖÈ룬²»ÐèÒª×öÈκεÄÅäÖÃÓëÐ޸ġ£²»¹ýȱµãÒ²ÔÚÕâÀÒòΪÈç¹ûÒª½«Æä×÷ΪÈÕ³£×Ô¶¯»¯µÄ¹¤¾ßʹÓõϰ£¬ÎÒÏ£Íû
MLeaksFinder ±¾Éí¿ÉÒÔÌṩ»Øµ÷½Ó¿Ú£¬ÒÔ±ãÔÚÄÚ´æÐ¹Â©·¢ÉúʱÎÒ¿ÉÒÔÑ¡ÔñÊǵ¯³ö Alert Ìáʾ¿ª·¢Õߣ¬»¹ÊÇͨ¹ýºǫ́Éϱ¨µÄ·½Ê½Ìá½»¡£µ±È»£¬¿ªÔ´µÄºÃ´¦ÔÚÓÚ¿ÉÒÔÐÞ¸ÄÔ´ÂëÂú×ã×Ô¼ºµÄÐèÇ󣬺óÐøÒ²»áÏòÆäÌá½»
PR£¬ÍêÉÆÕâ¸ö·Ç³£¾«ÇɵÄÏîÄ¿¡£
Facebook µÄ¹¤³ÌʦÃÇÆäʵÔç¾ÍÒѾ½« iOS µÄÄÚ´æÐ¹Â©ÅŲé×Ô¶¯»¯ÁË£¬²¢·¢²¼ÁËһƪ·Ç³£²»´íµÄÎÄÕÂÀ´½éÉÜÆäÔÀí£¬ÒÔ¼°¿ªÔ´ÁËËûÃǵÄÈý¸ö¹¤¾ßÌ×¼þ¡£ÎªÁ˼ÓÉî¶Ô
Objective-C ÄÚ´æ¹ÜÀíµÄÀí½âÒÔ¼°¶Ô¿âµÄÔÀíµÄÁ˽⣬ÔÚÎÄÄ©£¬»áÓÐÎÒ¶ÔÕâȫƪӢÎÄÎÄÕµķÒë¡£
¶ÔÓÚ¹¤³Ìʦ¶øÑÔ£¬×Ô¶¯»¯µÄ¹¤¾ßÕæµÄÊÇÅÅÃûǰ¼¸µÄÉú²úÁ¦¡£
Èç¹û²»Ïë¿´·ÒëµÄ»°£¬ÕâÀïÒ²Ìṩһ¸ö´ó¸ÅµÄÈ«ÎÄÖØµã¸ÅÀÀ£º
Èý¸ö¿ªÔ´¹¤¾ß£º
1.FBRetainCycleDetector
Ö÷ÒªÓÃÓÚ¼ì²âÑ»·ÒýÓÃ
2.FBAllocationTracker
Ö÷ÒªÓÃÓÚ¿ìËÙ¼ì²âDZÔÚµÄÄÚ´æÐ¹Â©¶ÔÏ󣬲¢Ìṩ¸ø FBRetainCycleDetector ½øÐмì²â
3.FBMemoryProfiler
¿ÉÊÓ»¯¹¤¾ß£¬Ö±½ÓǶÈëµ½ App ÖУ¬¿ÉÒÔÆðµ½ÔÚ App ÖÐÖ±½Ó²é¿´ÄÚ´æÊ¹ÓÃÇé¿ö£¬²¢É¸Ñ¡Ç±ÔÚй©¶ÔÏóµÄ×÷ÓÃ
Facebook µÄ×Ô¶¯»¯£º¿Í»§¶Ë×Ô¶¯¼à²â -> Éϱ¨·þÎñ¶Ë -> ¹éÀà/ɸѡ ->
·Ö·¢¸øÖ¸¶¨ÈËÔ± -> ´¦ÀíÄÚ´æÐ¹Â©
δ¿ªÔ´µÄ²¿·ÖÔÚÓÚ·þÎñ¶ËÈçºÎ¶ÔÉϱ¨µÄÑ»·ÒýÓÃÁ´½øÐйéÀàÓëɸѡ£¬²»¹ý Facebook µÄ¹¤³ÌʦÃÇÔÚÎÄÖиø³öÁËËûÃÇ×Ô¼ºµÄ²ßÂÔ
ÍØÕ¹ÔĶÁ
×îºó·ÅһЩÏà¹ØµÄ֪ʶµãµÄÍØÕ¹ÔĶÁ£¬ÓÐÖúÓÚÀí½âÈ«ÎÄÄÚÈÝ¡£
Objective-C Class Ivar Layout ̽Ë÷
Type Encodings
P.S.?Sunny ÀÏʦ£¨µÎµÎ?DynamicCocoa?µÄ×÷Õߣ©¶ÔÓÚ OC Runtime ÍæµÃÕæÊÇÁ¿´ËûµÄ²©¿Í·Ç³£³¤¼ûʶ¡
P.P.S.?ÂìÒϽð·þ²Æ¸»ÊÂҵȺ»¹ÔÚÕÐÆ¸ Android / iOS ¹¤³Ìʦ£¬Èç¹ûÄã¸ÐÐËȤµÄ»°»¶Ó¸øÎÒ·¢À´ÄãµÄ¼òÀú£ºyong.hy[AT]alipay.com
ÔÎÄÁ´½Ó [Ðè·Ç½]£ºAutomatic memory leak detection on iOS
ÒëÎÄ
ÄÚ´æÊÇÒÆ¶¯É豸ÉϵĹ²Ïí×ÊÔ´£¬Èç¹ûÒ»¸ö App ÎÞ·¨ÕýÈ·µØ½øÐÐÄÚ´æ¹ÜÀíµÄ»°£¬½«»áµ¼ÖÂÄÚ´æÏûºÄ´ù¾¡£¬ÉÁÍËÒÔ¼°ÐÔÄܵÄÑÏÖØÏ½µ¡£
Facebook µÄ iOS °æ±¾µÄÐí¶à¹¦ÄÜÄ£¿é¹²ÓÃÁËͬһ·ÝÄÚ´æ¿Õ¼ä£¬Èç¹ûÆäÖеÄijһ¸öÄ£¿éÏûºÄÁËÌØ±ð¶àµÄÄÚ´æ×ÊÔ´µÄ»°£¬½«»á¶ÔÕû¸ö
App Ôì³ÉÑÏÖØÓ°Ïì¡£¾Ù¸öÀõ×Ó£¬µ±Ä³¸ö¹¦ÄÜÄ£¿é²»Ð¡ÐÄÔì³ÉÁËÄÚ´æÐ¹Â©µÄʱºò£¬Õâ¸öÇé¿ö¾ÍºÜÓпÉÄܻᷢÉú¡£
ÔÚ Facebook£¬ÎÒÃÇÓзdz£¶àµÄ¹¤³ÌʦͬʱÔÚÒ»¸ö´úÂë²Ö¿âϽøÐв¢Ðпª·¢¡£ÄÚ´æÐ¹Â©ÊÇÔÚ¿ª·¢¹ý³ÌÖÐÄÑÒÔ±ÜÃâ»áÓö¼ûµÄÎÊÌâ¡£µ±ÄÚ´æÐ¹Â©·¢Éúʱ£¬ÎÒÃǾÍÐèÒª¿ìËÙµØÈ¥·¢ÏÖÈ»ºóÐÞ¸´Ëü¡£
ÏÖÔÚÒѾ´æÔÚһЩ¿ª·¢Õß¹¤¾ßÀ´¸¨Öú·¢ÏÖÄÚ´æÐ¹Â©ÁË£¬µ«ÊÇËüÃǵĹ²Í¬µãÊÇÐèÒª´óÁ¿µÄÈ˹¤²Ù×÷£º
´ò¿ª Xcode ²¢Ñ¡Ôñ build for profiling À´±àÒëÄãµÄ¹¤³Ì
´ò¿ª Instruments ¹¤¾ß
³¢ÊÔÔÚÄãµÄÓ¦ÓÃÉϾ¡¿ÉÄÜ¶àµØÖØÏÖ¸ü¶àµÄ³¡¾°ÓëÐÐΪ
¹Û²ìÄڴ湤¾ßµÄ×ßÊÆÍ¼
ÕÒµ½ÄÚ´æÐ¹Â©µÄÔ´Í·
ÐÞ¸´Ëü£¡
ÕâÑùµÄÈ˹¤ÅŲéÓëÐÞ¸´¹¤³Ìÿ´Î¶¼µÃ²»¶ÏµØÖظ´²Ù×÷¡£ÕýÒòΪÈç´Ë£¬ÎÒÃǺÜÄÑÔÚµü´ú½×¶ÎÔçÆÚ¾Í¶¨Î»ÓëÐÞ¸´ÄÚ´æÎÊÌâ¡£
½«ÄÚ´æÐ¹Â©µÄÅŲé¹ý³Ì¾¡¿ÉÄܵØ×Ô¶¯»¯£¬¼õÉÙ¿ª·¢ÈËÔ±µÄÈ˹¤¸ÉÔ¤£¬¿ÉÒÔ°ïÖúÎÒÃǸü¿ìµØÈ¥ÕÒµ½ÄÚ´æÐ¹Â©µÄµØ·½¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇÒѾÔÚÄÚ²¿¿ª·¢ÁËÒ»Ì×¹¤¾ßÀ´°ïÖúÎÒÃÇ×Ô¶¯»¯Õâ¸öÅŲé¹ý³Ì£¬²¢ÇÒÒѾ°ïÖúÎÒÃǽâ¾öÁËÐí¶à´úÂëÖдæÔÚµÄÄÚ´æÐ¹Â©ÎÊÌâ¡£½ñÌ죬ÎÒÃǺܸßÐËÏò´ó¼ÒÐû²¼ÎÒÃÇÕýʽ¿ªÔ´ÕâÌ×ÄÚ´æÐ¹Â©ÅŲ鹤¾ß£ºFBRetainCycleDetector£¬FBAllocationTracker?ºÍ?FBMemoryProfiler¡£
Ñ»·ÒýÓÃ
Objective-C ʹÓÃÒýÓüÆÊýÀ´¹ÜÀíÄÚ´æÓëÊÍ·Åδ±»ÒýÓõĶÔÏó¡£ÄÚ´æÖеĶÔÏó A ¿ÉÒÔÈöÔÏó B
µÄÒýÓüÆÊý¼ÓÒ»£¬¼´ retain£¬À´Ê¹¶ÔÏó B ¾¡¿ÉÄܾõشæÔÚÄÚ´æÖУ¨Ö»Òª¶ÔÏó A ²»¶ÔËü¡°¼õÒ»¡±£¬¼´
release£©¡£Ò²¾ÍÊÇ˵£º¶ÔÏó A ³ÖÓÐÁ˶ÔÏó B ¡£
´ó¶àÊýÇé¿öÏ£¬ÒýÓüÆÊýÕâÌ×»úÖÆ¶¼¿ÉÒÔÔË×÷µÃºÜºÃ¡£µ«ÊÇ£¬µ±Á½¸ö¶ÔÏóÖ±½ÓµØ£¬»òÕ߸ü³£¼ûµÄÇéÐÎÊÇͨ¹ýijЩ¶ÔÏó¼ä½ÓµØ£¬»¥Ïà³ÖÓÐÁ˶Է½£¬Õâ¸öʱºò¾ÍÏÝÈëÁ˽©¾ÖÁË¡£ÕâÖÖ»¥Ïà³ÖÓжԷ½µÄÒýÓõÄÏÖÏó½Ð×öÑ»·ÒýÓá£

Ñ»·ÒýÓûᵼÖÂһϵÁеÄÎÊÌâ¡£×îºÃµÄÇé¿öÊÇ£¬Ð¹Â©µÄ¶ÔÏó±¾Éí¾Í»áÒ»Ö±³¤ÆÚµØÕ¼ÓÃÄÚ´æ¿Õ¼ä£¬ÕâÖÖÇé¿öÒ»°ã²»»áÔì³ÉÌ«´óµÄÄÚ´æÏûºÄ¡£Èç¹ûй©µÄ¶ÔÏó²»Í£µØÔö¼ÓÓë»ýÀÛ£¬ÄÇô
App ÖÐÆäËû¹¦ÄÜÄ£¿éËùÄÜʹÓõÄÄÚ´æ¾Í»á¼õÉÙ¡£×µÄÇé¿öÔòÊÇ£¬ÄÚ´æÐ¹Â©µ¼ÖÂÁË App ÐèҪʹÓõÄÄڴ泬³öÁËÏÞÖÆ£¬ÕâʱӦÓþͻáÉÁÍËÁË¡£
ͨ¹ýÈ˹¤ÅŲéµÄÊֶΣ¬ÎÒÃÇ·¢ÏÖÎÒÃÇÓÐÌ«¶àÒòΪѻ·ÒýÓõ¼ÖµÄÄÚ´æÐ¹Â©ÁË¡£ÈÕ³£±àÂëÖУ¬ÉÔ²»¼Ó×¢Òâ¾ÍÓпÉÄܰÑÑ»·ÒýÓøøÒýÈëµ½´úÂëÀ¶øÖ®ºóÈ´²»ÈÝÒ×·¢ÏÖËûÃÇ¡£FBRetainCycleDetector?Õâ¸ö¹¤¾ß½«°ïÖúÎÒÃǰÑÑ»·ÒýÓõļà²â±äµÃ¸ü¼Ó¼òµ¥¡£
ÔÚÔËÐÐÆÚ¼à²âÑ»·ÒýÓÃ
ÔÚ Objective-C Öмì²âÑ»·ÒýÓÿÉÒÔ³éÏóΪÔÚÒ»¸ö½ÚµãΪ¶ÔÏ󣬱ßΪ¶ÔÏóÖ®¼äµÄÒýÓùØÏµµÄÓÐÏòÎÞ»·Í¼£¨DAG
ͼ£©ÖÐѰÕÒ´æÔڵĻ·¡£µ±ËùÓÐµÄ Objective-C ¶ÔÏóÒѾÔÚÎÒÃǵÄÓÐÏòÎÞ»·Í¼ÖÐʱ£¬ÎÒÃÇËùÐèÒª×öµÄ¾ÍÊÇͨ¹ýÉî¶ÈÓÅÏÈËÑË÷Ëã·¨À´±éÀúËü£¬²¢ÕÒµ½Ñ»·½Úµã¡£
ÕâÀïÓиöÊÓÆµ - Ðè·Ç½
½«Ñ»·ÒýÓõļì²âÎÊÌâ³éÏóΪ¼òµ¥µÄÊý¾Ý½á¹¹Ëã·¨Ö®ºó£¬Õû¸ö·½°¸¾Í±äµÃ·Ç³£ÇåÎúÁË¡£ÎÒÃÇÐèҪȷÈϵľÍÊÇÎÒÃÇÄܹ»ÔÚÔËÐÐÆÚÕÒµ½ËùÓеÄÄÚ´æ¶ÔÏó²¢ÕÒ³öËûÃÇÖ®¼äËùÓеÄÒýÓùØÏµ¡£¶ÔÏóÖ®¼äµÄÒýÓùØÏµ¿ÉÄÜÊÇÈõÒýÓã¬Ò²¿ÉÄÜÊÇÇ¿ÒýÓ᣶øÖ»ÓжÔÏóÖ®¼äµÄÇ¿ÒýÓòŻᵼÖÂÑ»·ÒýÓá£Òò´Ë£¬ÎÒÃÇÖ»ÐèÒªÕÒµ½Ã¿¸ö¶ÔÏóËù´æÔÚµÄÇ¿ÒýÓü´¿É¡£
ÐÒÔ˵ØÊÇ£¬Objective-C Ìṩ¸øÁËÎÒÃǷdz£Ç¿´óµÄ Runtime ¿â£¬¿ÉÒÔ°ïÖúÎÒÃÇÔÚÔËÐÐÆÚ»ñÈ¡×ã¹»µÄÊý¾ÝÀ´¹¹½¨ÕâÑùÒ»ÕÅÓÐÏòÎÞ»·Í¼¡£
ÓÐÏòÎÞ»·Í¼ÖеĽڵã¿ÉÒÔÊÇÒ»¸ö¶ÔÏ󣬻òÕßÊÇÒ»¸ö block£¬½ÓÏÂÀ´ÎÒÃǽ«·Ö±ð½øÐÐÌÖÂÛ¡£
Objects£¨¶ÔÏó£©
Objective-C Runtime ÌṩÁ˺ܶ๤¾ßÀ´°ïÖúÎÒÃÇÔÚÔËÐÐÆÚ»ñȡһ¸ö¶ÔÏóµÄÏêϸÐÅÏ¢£¨Ò²³Æ×÷ÄÚÊ¡£¬Introspection£¬ÕâÊÇÃæÏò¶ÔÏóÓïÑԺͻ·¾³µÄÒ»¸öÇ¿´óÌØÐÔ£©¡£
ÎÒÃÇÒª×öµÄµÚÒ»¼þÊÂÇé¾ÍÊÇ»ñÈ¡¶ÔÏóÖÐËùÓбäÁ¿µÄ ivar layout¡£

¶ÔÓÚÒ»¸ö¸ø¶¨µÄ¶ÔÏó£¬ËüµÄ ivar layout ¿ÉÒÔÈÃÎÒÃÇ»ñÈ¡µ½Õâ¸ö¶ÔÏó³ÖÓÐÁ˶àÉÙ¶Ô±ðµÄ¶ÔÏóµÄÒýÓùØÏµ¡£ivar
layout ΪÎÒÃÇÌṩÁËÒ»¸öÄÚ´æµØÖ·Æ«ÒÆÁ¿µÄ¡°Ë÷Òý¡±£¬ÈÃÎÒÃÇÄܹ»Í¨¹ý¶Ô¡°Ë÷Òý¡±µÄµþ¼ÓÀ´µÃµ½ËüËù³ÖÓеÄÁíÒ»¸ö¶ÔÏóµÄÄÚ´æµØÖ·¡£OC
Runtime Ò²¸øÎÒÃÇÌṩÁË¿ÉÒÔ»ñȡһ¸ö¶ÔÏóµÄËùÓеÄÈõÒýÓùØÏµµÄ¹¤¾ß£ºweak ivar layout¡£ÎÒÃÇ¿ÉÒÔ¼Ù¶¨£º
ivar layout Óë weak ivar layout Ö®¼äµÄ¹ØÏµÁ´Ìõ²îÖµ¼´Ò»¸ö¶ÔÏóµÄËùÓÐÇ¿ÒýÓùØÏµ¡£
³ý´ËÖ®Í⣬»¹ÐèÒª¶îÍâ×öÒ»²¿·Ö¹¤×÷À´Ö§³Ö Objective-C++¡£ÔÚ Objective-C++ ÖУ¬ÎÒÃÇ¿ÉÒÔÔÚ
structs Öж¨Òå¶ÔÏ󣬶øÕâÑùµÄ¶ÔÏ󲻻ᱻ ivar layout ÌṩË÷Òý¡£¶ø OC Runtime
¸ÕºÃÌṩÁËÀàÐͱàÂë»úÖÆ£¨Type Encoding£©À´°ïÖúÎÒÃÇ´¦ÀíÕâ¸öÎÊÌâ¡£¶ÔÓÚÿһ¸öʵÀý±äÁ¿£¬ÀàÐͱàÂë¿ÉÒÔ¸æËßÎÒÃÇÕâ¸ö¶ÔÏóÊÇʲôÑùµÄÊý¾ÝÀàÐÍ¡£Èç¹û¶ÔÏóÊǸö
struct£¬ÄÇôÀàÐͱàÂë»á¸æËßÎÒÃÇÕâ¸ö struct ÊÇÓÉÄÄЩ×ֶκÍÀàÐÍ×é³ÉµÄ¡£ÎÒÃÇͨ¹ýת»»ÀàÐͱàÂëÀ´·¢ÏÖÄÄЩʵÀý±äÁ¿ÊÇ
Objective-C µÄ¶ÔÏ󣬲¢¼ÆËãÄÚ´æµØÖ·µÄÆ«ÒÆÁ¿À´»ñÈ¡ËùÓÐËûÃÇÖ¸ÏòµÄ¶ÔÏóµØÖ·¡£
²»¹ýÈÔÈ»ÓÐһЩ±ß½ç case ÎÒÃDz»ÄÜÉîÈëµØÈ¥½â¾ö¡£´ó¶àÊýÊǸúһЩ¼¯ºÏÀàÐÍÏà¹ØµÄ£¬ÎÒÃDz»µÃ²»±éÀú¼¯ºÏÀ´»ñÈ¡ËùÓеıäÁ¿Ëù³ÖÓеĶÔÏó£¬Õâ¿ÉÄܻᵼÖÂһЩDZÔڵĸ±×÷Óá£
Blocks
Blocks ¸ú¶ÔÏóÓÐһЩ²»Í¬¡£OC Runtime ûÓÐÌṩ¸øÎÒÃǼòµ¥µÄ»ñÈ¡ËüµÄ ivar layout
µÄ·½·¨£¬µ«ÊÇÎÒÃÇ¿ÉÒÔͨ¹ýһЩС trick À´½â¾öÕâ¸öÎÊÌâ¡£
ÎÒÃÇ½è¼øÁË Mike Ash ÔÚËûµÄÏîÄ¿?Circle?ÖÐʹÓõķ½·¨À´´¦Àí blocks£¬Õâ¸ö·½°¸Ò²Æô·¢ÁËÎÒÃÇ¿ª·¢ÁË
FBRetainCycleDetector¡£
ÕâÀïÎÒÃÇÔËÓõ½ÁË ABI £¨application binary interface for blocks£©¡£Ëü¸æËßÎÒÃÇ
block ÔÚÄÚ´æÖÐÊÇÒÔÔõÑùµÄÐÎʽ´æÔڵġ£Èç¹ûÎÒÃÇÖªµÀÎÒÃÇÔÚ´¦ÀíµÄÒýÓÃÊÇÒ»¸ö block µÄ»°£¬ÄÇôÎÒÃÇ¿ÉÒÔ½«Æäת»¯ÎªÒ»¸ö¼ÙµÄÄ£Äâ
block µÄ struct ¶ÔÏó¡£ÔÚ½« block ת»¯Îª struct Ö®ºó£¬ÎÒÃǾÍÄܹ»ÖªµÀËüËù³ÖÓеÄÄÚ´æ¶ÔÏóÁË¡£µ«ÊDz»ÐÒµØÊÇ£¬ÎÒÃDz¢²»ÖªµÀÕâЩÒýÓùØÏµÊÇÇ¿ÒýÓû¹ÊÇÈõÒýÓá£
ÎÒÃÇÓÃÁ˺ںм¼ÊõÀ´½â¾öÕâ¸öÎÊÌâ¡£ÎÒÃÇ´´½¨ÁËÒ»¸ö¼Ù×°ÊÇÎÒÃÇÒªÅŲéµÄ block µÄ¶ÔÏó£¬ÇÒÎÒÃÇÖªµÀ block
µÄ½Ó¿Ú½á¹¹£¬ÒÔ¼°µ½ÄÄÈ¥ÕÒ block Ëù³ÖÓеÄÒýÓ᣶øÔÚÎÒÃÇ¡°Î±ÔìµÄ¡± block ¶ÔÏóÖУ¬²¢Ã»ÓÐʵ¼Ê³ÖÓÐÒýÓ㬶øÊdzÖÓÐÁË¡°ÊÍ·Å̽²âÆ÷¡±£¨release
detectors£©¡£ÊÍ·Å̽²âÆ÷ÊÇһЩÓÃÀ´¼àÌý·¢Ë͸øËûÃǵÄÄÚ´æÊÍ·ÅÏûÏ¢µÄС¶ÔÏó¡£µ±Ò»¸ö¶ÔÏóÒª½â³ýÒýÓùØÏµµÄʱºò£¬Ëü»áÏñÆä³ÖÓеÄÇ¿ÒýÓöÔÏó·¢ËÍÄÚ´æÊͷŵÄÏûÏ¢¡£ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔÔÚÊÍ·Å¡°Î±ÔìµÄ¡±
block ¶ÔÏóµÄʱºò£¬¼ì²éÒ»ÏÂÄĸö̽²âÆ÷ÊÕµ½ÁËÄÚ´æÊͷŵÄÏûÏ¢£¬ÕâЩÊÕµ½ÏûÏ¢µÄ̽²âÆ÷£¬¼´´æÔÚÇ¿ÒýÓùØÏµ£¬ÕâÑù¾Í¿ÉÒÔ°ïÖúÎÒÃÇÕÒ³öÕæÊµµÄ
block ¶ÔÏóÖÐËù³ÖÓеĶÔÏóÒýÓÃÁË¡£

×Ô¶¯»¯
Õâ¸öÄÚ´æ¼ì²â¹¤¾ßÔÚÎÒÃÇÈÕ³£³ÖÐø²»¶ÏµØµü´ú¹¹½¨¿ª·¢ÖУ¬²»Í£µØ·¢¹â·¢Èȹ±Ï××Å×Ô¼ºµÄÒ»·ÝÁ¦¡£
ÔÚ¿Í»§¶ËÉϵÄ×Ô¶¯»¯·Ç³£µØ¼òµ¥¡£ÎÒÃÇÔÚ×Ô¼ºµÄ App ÀïÌí¼ÓÁË Retain Cycle Detector
µÄÒÀÀµ£¬²¢ÖÜÆÚÐÔµØÉ¨ÃèÄÚ´æÆ¬¶ÎÀ´¼ì²âÑ»·ÒýÓᣵ±È»£¬ËüÒ²²¢²»ÊÇÍêèµÎÞ覵ġ£µ±ÎÒÃǵÚÒ»´ÎÔËÐÐ Retain
Cycle Detector µÄʱºò£¬ÎÒÃǾÍÒâʶµ½ÁËËüÊÇÎÞ·¨·Ç³£¿ìµØÉ¨ÃèÕû¸öÄÚ´æÊ¹Óõģ¬ÎÒÃÇÐèҪΪËüÌṩһЩɸѡ¹ýºóµÄÄÚ´æ¶ÔÏóÀ´ÈÃËü½øÐмì²â¡£
ΪÁ˸üÓÐЧµØ½øÐжÔÏóɸѡ£¬ÎÒÃÇ¿ª·¢ÁË FBAllocationTracker¡£ÕâÊÇÒ»¸öÓÃÀ´Ö÷¶¯×·×ÙËùÓÐ
NSObject µÄ×ÓÀàµÄÄÚ´æ·ÖÅäºÍÊͷŲÙ×÷µÄ¹¤¾ß¡£Ëü¿ÉÒÔÔÚ×îСµÄÐÔÄÜÏûºÄÏ£¬ÔÚ¸ø¶¨µÄʱ¼äµã¿ìËÙ»ñÈ¡ÈκÎÀàµÄÈκÎʵÀý¡£
ÔÚ¿Í»§¶ËÉÏ×Ô¶¯½øÐÐÄÚ´æÐ¹Â©¼à²âʵ¼ÊÉϾÍÊÇÅäºÏʹÓà FBRetainCycleDetector ¼Ó¶¨Ê±Æ÷£¬ÔÙ¼ÓÉÏ¿ÉÒÔΪÎÒÃÇɸѡ¼ì²â¶ÔÏóµÄ
FBAllocationTracker¡£
ÏÖÔÚÈÃÎÒÃÇÀ´¿´Ïºó¶ËÐèÒª×öÄÄÐ©ÌØ±ðµÄ´¦Àí¡£
Ñ»·ÒýÓÿÉÒÔÓÉÈÎÒâÊýÁ¿µÄ¶à¸ö¶ÔÏó×é³É¡£µ«Êǵ±³öÏÖÁËÒ»¸ö»µÁ´½Ó¶øµ¼Ö³öÏÖ¶à¸öÑ»·Ê±£¬ÊÂÇé¾Í±äµÃ¸´ÔÓÆðÀ´ÁË¡£

A¡úB is a bad link in a cycle, and two kinds of cycles
are created because of that: A-B-C-D and A-B-C-E.
Õâ»áµ¼ÖÂÁ½¸öÎÊÌ⣺
Èç¹ûÊÇÒòΪһ¸ö»µÁ´½Óµ¼ÖµÄÁ½¸öÑ»·ÒýÓã¬ÎÒÃDz¢²»Ïë°ÑËûÃÇ·Ö¿ª±ê¼Ç³öÀ´
Èç¹ûÕæµÄÊÇÁ½¸öÑ»·ÒýÓÃÎÊÌ⣬¼´±ãÊǹ²ÏíÁËÒ»¸öÁ´½Ó£¬ÎÒÃÇÒ²²»Ïë°ÑËûÃDZê¼ÇÔÚÒ»Æð
Òò´Ë£¬ÎÒÃÇÐèÒª¶ÔÑ»·ÒýÓýøÐйéÀ࣬Ϊ´ËÎÒÃÇҲдÁËÒ»¸öËã·¨À´Æô·¢Ê½µØ°ïÖúÎÒÃÇ´¦ÀíÕâ¸öÎÊÌ⣺
½«Í¬Ò»Ìì¼ì²âµ½µÄÑ»·ÒýÓùéÀà
¶Ôÿһ¸öÑ»·ÒýÓã¬ÌáÈ¡³ö Facebook ÌØÓеÄÀàÃû
¶Ôÿһ¸öÑ»·ÒýÓã¬ÕÒµ½ÆäÖÐÒѾ±»Éϱ¨¹ýµÄ¡¢²¢°üº¬ÔÚÆäÖеÄ×îС»·
½«Ã¿¸öÑ»·ÒýÓÃÌí¼Óµ½ÉÏÊö×îС»·Ëù±íʾµÄ×éÖÐ
Ö»¶Ô×îС»·½øÐÐÉϱ¨
×öÍêÉÏÊöµÄ´¦ÀíÖ®ºó£¬×îºóÒª×öµÄÊÂÇé¾ÍÊÇÕÒµ½Äĸö¹¤³Ìʦ¸Ä¶¯ÁË´úÂëµ¼ÖÂÁËÄÚ´æÐ¹Â©µÄ·¢Éú¡£ÎÒÃÇͨ¹ý ¡®git/hg
blame¡¯ ÅäºÏÑ»·ÒýÓÃÖеIJ¿·Ö´úÂ룬À´ÍƲâ³ö¿ÉÄÜÊÇij¸ö¹¤³ÌʦµÄ¸Ä¶¯µ¼ÖµÄÎÊÌâ·¢Éú£¬²¢ÔÚÄÚ²¿µÄ°ì¹«ÏµÍ³ÖÐ¶ÔÆä·¢³ö֪ͨ£¬ÈÃËû¾¡¿ìÐÞ¸´Õâ¸öÎÊÌâ¡£
Õû¸ö×Ô¶¯»¯ÏµÍ³¿ÉÒÔͨ¹ýÏÂÃæµÄͼÐνøÐбíʾ£º

È˹¤¼ì²â
ËäÈ»×Ô¶¯»¯µÄ·½Ê½°ïÖúÎÒÃǼò»¯ÁËÑ»·ÒýÓõÄÅŲ飬Ҳ¼õÇáÁËÎÒÃǹ¤³ÌʦµÄ¸ºµ££¬µ«ÊÇÈ˹¤ÅŲéÈÔÈ»¾ßÓв»¿ÉÌæ´úµÄ×÷Óá£Îª´Ë£¬ÎÒÃÇ»¹¿ª·¢ÁË
FBMemoryProfiler À´ÈÃÈκÎÈ˶¼¿ÉÒÔÔÚ²»°Ñ iPhone Á¬½Óµ½µçÄÔµÄÇé¿öÏ£¬Ò²¿ÉÒÔµ±Ç°
App µÄÄÚ´æÊ¹ÓÃÇé¿ö¡£
FBMemoryProfiler ¿ÉÒÔͨ¹ýºÜ¼òµ¥µÄ·½Ê½¾ÍÌí¼Óµ½ÈκΠApp ÖУ¬ÈÃÄã¾ß±¸Ö±½ÓÔÚ App
Öв鿴ÄÚ´æÊ¹ÓÃÇé¿ö£¬²¢ÊÖ¶¯¼ì²éÑ»·ÒýÓõÄÄÜÁ¦¡£FBMemoryProfiler ÒÀÀµÁË FBAllocationTracker
ºÍ FBRetainCycleDetector À´ÊµÏÖÕâЩ¹¦ÄÜ¡£
ÕâÀïÓиöÊÓÆµ - Ðè·Ç½
Generations£¨´ú£©
FBMemoryProfiler ÌṩµÄÁíÒ»¸ö·Ç³£ºÃÓõŦÄÜÊÇ¡°´ú×·×Ù¡±£¨generation tracking£©£¬ÀàËÆÓÚ
Xcode ÌṩµÄ Instruments ÀïµÄ´ú×·×ٵŦÄÜ¡£¡°´ú¡±£¨Generation£©¿ÉÒÔÈÏΪÊÇÁ½¸öʱ¼äÇÐÆ¬Ö®¼äËùÓдæÔÚµÄÄÚ´æ¶ÔÏóµÄ¿ìÕÕ£¨snapshots£©¡£
¾Ù¸öÀõ×Ó£¬Í¨¹ý FBMemoryProfiler ÌṩµÄ UI Äã±ê¼ÇÁËÒ»´Îʱ¼äµã£¬Õâʱ·ÖÅäÁËÈý¸öÄÚ´æ¶ÔÏó¡£È»ºóÄã±ê¼ÇÁËÁíÒ»¸öʱ¼äµã£¬Í¬Ê±Ò²¼ÌÐø·ÖÅäÄÚ´æ¶ÔÏó¡£µÚÒ»¸öʱ¼äµãµÄÄÚ´æÖÐÖ»°üº¬ÁËÎÒÃÇ×ʼµÄÈý¸öÄÚ´æ¶ÔÏó¡£Èç¹ûÆäÖÐÈκÎÒ»¸ö¶ÔÏó±»ÊÍ·ÅÁË£¬ÄÇôËü¾Í²»»á´æÔÚµÚ¶þ¸öʱ¼äµãµÄÄÚ´æÇÐÆ¬ÖС£

µ±ÎÒÃÇÐèÒª×öÒ»Ð©ÖØ¸´µÄ¶¯×÷µÄʱºò£¬´ú×·×ÙÕâ¸ö¹¦ÄÜÊǷdz£ÓÐÓõġ£¾Ù¸öÀõ×Ó£¬±ÈÈçÎÒÃÇÐèÒª·´¸´½ø³öij¸ö View
Controller µÄʱºò¡£ÎÒÃÇÿ´Î¶¼ÔÚ½øÈë View Controller ֮ǰ±ê¼ÇÒ»ÏÂÄÚ´æ¿ìÕÕ£¬È»ºó×Ðϸ¹Ø×¢Ò»ÏÂÿ´ÎÄÚ´æ¿ìÕÕ¶¼ÓÐÄÄЩ¶ÔÏóʣϡ£Èç¹ûÓиö¶ÔÏó´æÔÚµÄʱ¼ä³¬³öÁËËüÔ±¾µÄÔ¤ÆÚµÄ»°£¬ÎÒÃǾͿÉÒԷdz£Ö±¹ÛµØ´Ó
FBMemoryProfiler ÉÏ¿´µ½¡£
À´ÊÔÊÔ¿´°É
²»ÂÛÄãÊǾÞÎÞ°Ô App »¹ÊÇÒ»¸öСÐÍÓ¦Óã¬Á¼ºÃµÄÄÚ´æ¹ÜÀí¶¼ÊÇÒ»¸öºÃµÄ¹¤³Ìϰ¹ß¡£Í¨¹ýÕâЩ¹¤¾ßµÄ°ïÖú£¬ÎÒÃÇÄܹ»¸üΪ±ã½ÝµØÈ¥·¢ÏÖºÍÐÞ¸´ÄÚ´æÐ¹Â©µÄÎÊÌ⣬ÈÃÎÒÃÇÊ¡ÏÂÄÇЩȥÊÖ¶¯¼ì²âµÄʱ¼ä£¬¸ü¼Ó¾Û½¹ÔÚд³ö¸üºÃµÄ´úÂëÉÏ¡£ÎÒÃÇҲϣÍûÄãÄܹ»´ÓÕâЩ¹¤¾ßÀïµÃµ½°ïÖú¡£À´
Github ÉϸøÎÒÃǼӸö star °É£ºFBRetainCycleDetector£¬FBAllocationTracker?ºÍ?FBMemoryProfiler¡£ |