Ô¶¹Åʱ´úµÄ¹ÊÊÂ
ÄÇЩ¾Àú¹ýÊÖ¹¤¹ÜÀíÄڴ棨MRC£©Ê±´úµÄÈËÃÇ£¬Ò»¶¨¶Ô iOS ¿ª·¢ÖеÄÄÚ´æ¹ÜÀí¼ÇÒäÓÌС£ÄǸöʱºò´óÔ¼ÊÇ
2010 Ä꣬¹úÄÚ iOS ¿ª·¢¸Õ¸ÕÐËÆð£¬tinyfool ´óÊåµÄ´óÃûÒѾÈçÀ×¹á¶ú£¬¶øÎÒ»¹ÊÇÒ»¸öĬĬÎÞÎŵĸձÏÒµµÄС×Ó¡£ÄǸöʱºòµÄ
iOS ¿ª·¢¹ý³ÌÊÇÕâÑùµÄ£º
ÎÒÃÇÏÈдºÃÒ»¶Î iOS µÄ´úÂ룬ȻºóÆÁסºôÎü£¬¿ªÊ¼ÔËÐÐËü£¬²»³öËùÁÏ£¬Ëü±ÀÀ£ÁË¡£ÔÚ MRC ʱ´ú£¬¼´Ê¹ÊÇ×îÅ£±ÆµÄ
iOS ¿ª·¢Õߣ¬Ò²²»Äܱ£Ö¤Ò»´ÎÐÔ¾Íд³öÍêÃÀµÄÄÚ´æ¹ÜÀí´úÂë¡£ÓÚÊÇ£¬ÎÒÃÇ¿ªÊ¼Ò»²½Ò»²½µ÷ÊÔ£¬ÊÔ×Å´òÓ¡³öÿ¸ö»³ÒɶÔÏóµÄÒýÓüÆÊý£¨Retain
Count£©£¬È»ºó£¬ÎÒÃÇСÐÄÒíÒíµØ²åÈëºÏÀíµÄ retain ºÍrelease ´úÂë¡£¾¹ýÒ»´ÎÓÖÒ»´ÎµÄÓ¦ÓñÀÀ£ºÍµ÷ÊÔ£¬ÖÕÓÚÓÐÒ»´Î£¬Ó¦ÓÃÄܹ»Õý³£ÔËÐÐÁË£¡ÓÚÊÇÎÒÃdz¤ÊæÒ»¿ÚÆø£¬Â¶³ö¾ÃÎ¥µÄ΢Ц¡£
Êǵģ¬Õâ¾ÍÊÇÄǸöÄê´úµÄ iOS ¿ª·¢Õߣ¬Í¨³£Çé¿öÏ£¬ÎÒÃÇÔÚ¿ª·¢ÍêÒ»¸ö¹¦Äܺó£¬ÐèÒªÔÙ»¨ºÃ¼¸¸öСʱ£¬²ÅÄܰÑÒýÓüÆÊý¹ÜÀíºÃ¡£
Æ»¹ûÔÚ 2011 ÄêµÄʱºò£¬ÔÚ WWDC ´ó»áÉÏÌá³öÁË×Ô¶¯µÄÒýÓüÆÊý£¨ARC£©¡£ARC ±³ºóµÄÔÀíÊÇÒÀÀµ±àÒëÆ÷µÄ¾²Ì¬·ÖÎöÄÜÁ¦£¬Í¨¹ýÔÚ±àÒëʱÕÒ³öºÏÀíµÄ²åÈëÒýÓüÆÊý¹ÜÀí´úÂ룬´Ó¶ø³¹µ×½â·Å³ÌÐòÔ±¡£
ÔÚ ARC ¸Õ¸Õ³öÀ´µÄʱºò£¬Òµ½ç¶Ô´ËºÚ¿Æ¼¼³äÂúÁË»³Òɺ͹ÛÍû£¬¼ÓÉÏÏÖÓÐµÄ MRC ´úÂëÒª×öÇ¨ÒÆ±¾À´Ò²ÐèÒª¶îÍâµÄ³É±¾£¬ËùÒÔ
ARC ²¢Ã»Óб»ºÜ¿ì½ÓÊÜ¡£Ö±µ½ 2013 Äê×óÓÒ£¬Æ»¹ûÈÏΪ ARC ¼¼Êõ×ã¹»³ÉÊ죬ֱ½Ó½« macOS£¨µ±Ê±½Ð
OS X£©ÉϵÄÀ¬»ø»ØÊÕ»úÖÆ·ÏÆú£¬´Ó¶øÊ¹µÃ ARC ѸËÙ±»½ÓÊÜ¡£
2014 ÄêµÄ WWDC ´ó»áÉÏ£¬Æ»¹ûÍÆ³öÁË Swift ÓïÑÔ£¬¶ø¸ÃÓïÑÔÈÔȻʹÓà ARC ¼¼Êõ£¬×÷ΪÆäÄÚ´æ¹ÜÀí·½Ê½¡£
ΪʲôÎÒÒªÌáÕâ¶ÎÀúÊ·ÄØ£¿¾ÍÊÇÒòΪÏÖÔÚµÄ iOS ¿ª·¢ÕßʵÔÚÌ«Êæ·þÁË£¬´ó²¿·Öʱºò£¬ËûÃǸù±¾¶¼²»ÓùØÐijÌÐòµÄÄÚ´æ¹ÜÀíÐÐΪ¡£µ«ÊÇ£¬ËäÈ»
ARC °ïÎÒÃǽâ¾öÁËÒýÓüÆÊýµÄ´ó²¿·ÖÎÊÌ⣬һЩÄêÇáµÄ iOS ¿ª·¢ÕßÈÔÈ»»á×ö²»ºÃÄÚ´æ¹ÜÀí¹¤×÷¡£ËûÃÇÉõÖÁ²»ÄÜÀí½â³£¼ûµÄÑ»·ÒýÓÃÎÊÌ⣬¶øÕâЩÎÊÌâ»áµ¼ÖÂÄÚ´æÐ¹Â©£¬×îÖÕʹµÃÓ¦ÓÃÔËÐлºÂý»òÕß±»ÏµÍ³ÖÕÖ¹½ø³Ì¡£
ËùÒÔ£¬ÎÒÃÇÿһ¸ö iOS ¿ª·¢Õߣ¬ÐèÒªÀí½âÒýÓüÆÊýÕâÖÖÄÚ´æ¹ÜÀí·½Ê½£¬Ö»ÓÐÕâÑù£¬²ÅÄÜ´¦ÀíºÃÄÚ´æ¹ÜÀíÏà¹ØµÄÎÊÌâ¡£
ʲôÊÇÒýÓüÆÊý
ÒýÓüÆÊý£¨Reference Count£©ÊÇÒ»¸ö¼òµ¥¶øÓÐЧµÄ¹ÜÀí¶ÔÏóÉúÃüÖÜÆÚµÄ·½Ê½¡£µ±ÎÒÃÇ´´½¨Ò»¸öжÔÏóµÄʱºò£¬ËüµÄÒýÓüÆÊýΪ
1£¬µ±ÓÐÒ»¸öеÄÖ¸ÕëÖ¸ÏòÕâ¸ö¶ÔÏóʱ£¬ÎÒÃǽ«ÆäÒýÓüÆÊý¼Ó 1£¬µ±Ä³¸öÖ¸Õë²»ÔÙÖ¸ÏòÕâ¸ö¶ÔÏóÊÇ£¬ÎÒÃǽ«ÆäÒýÓüÆÊý¼õ
1£¬µ±¶ÔÏóµÄÒýÓüÆÊý±äΪ 0 ʱ£¬ËµÃ÷Õâ¸ö¶ÔÏó²»ÔÙ±»ÈκÎÖ¸ÕëÖ¸ÏòÁË£¬Õâ¸öʱºòÎÒÃǾͿÉÒÔ½«¶ÔÏóÏú»Ù£¬»ØÊÕÄÚ´æ¡£ÓÉÓÚÒýÓüÆÊý¼òµ¥ÓÐЧ£¬³ýÁË
Objective-C ºÍ Swift ÓïÑÔÍ⣬΢ÈíµÄ COM£¨Component Object Model
£©¡¢C++11£¨C++11 ÌṩÁË»ùÓÚÒýÓüÆÊýµÄÖÇÄÜÖ¸Õë share_prt£©µÈÓïÑÔÒ²ÌṩÁË»ùÓÚÒýÓüÆÊýµÄÄÚ´æ¹ÜÀí·½Ê½¡£

ΪÁ˸üÐÎÏóһЩ£¬ÎÒÃÇÔÙÀ´¿´Ò»¶Î Objective-C µÄ´úÂ롣н¨Ò»¸ö¹¤³Ì£¬ÒòΪÏÖÔÚĬÈϵŤ³Ì¶¼¿ªÆôÁË×Ô¶¯µÄÒýÓüÆÊý
ARC£¨Automatic Reference Count)£¬ÎÒÃÇÏÈÐ޸Ť³ÌÉèÖ㬸ø AppDelegate.m
¼ÓÉÏ -fno-objc-arc µÄ±àÒë²ÎÊý£¨ÈçÏÂͼËùʾ£©£¬Õâ¸ö²ÎÊý¿ÉÒÔÆôÓÃÊÖ¹¤¹ÜÀíÒýÓüÆÊýµÄģʽ¡£

È»ºó£¬ÎÒÃÇÔÚÖÐÊäÈëÈçÏ´úÂ룬¿ÉÒÔͨ¹ý Log ¿´µ½ÏàÓ¦µÄÒýÓüÆÊýµÄ±ä»¯¡£
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSObject *object = [[NSObject alloc] init]; NSLog(@"Reference Count = %u", [object retainCount]); NSObject *another = [object retain]; NSLog(@"Reference Count = %u", [object retainCount]); [another release]; NSLog(@"Reference Count = %u", [object retainCount]); [object release]; // µ½ÕâÀïʱ£¬object µÄÄÚ´æ±»ÊÍ·ÅÁË return YES; } |
ÔËÐнá¹û£º
Reference Count = 1 Reference Count = 2 Reference Count = 1 |
¶Ô Linux Îļþϵͳ±È½ÏÁ˽âµÄͬѧ¿ÉÄÜ·¢ÏÖ£¬ÒýÓüÆÊýµÄÕâÖÖ¹ÜÀí·½Ê½ÀàËÆÓÚÎļþϵͳÀïÃæµÄÓ²Á´½Ó¡£ÔÚ Linux
ÎļþϵͳÖУ¬ÎÒÃÇÓà ln ÃüÁî¿ÉÒÔ´´½¨Ò»¸öÓ²Á´½Ó£¨Ï൱ÓÚÎÒÃÇÕâÀïµÄ retain)£¬µ±É¾³ýÒ»¸öÎļþʱ£¨Ï൱ÓÚÎÒÃÇÕâÀïµÄ
release)£¬ÏµÍ³µ÷Óûá¼ì²éÎļþµÄ link count Öµ£¬Èç¹û´óÓÚ 1£¬Ôò²»»á»ØÊÕÎļþËùÕ¼ÓõĴÅÅÌÇøÓò¡£Ö±µ½×îºóÒ»´Îɾ³ýǰ£¬ÏµÍ³·¢ÏÖ
link count ֵΪ 1£¬Ôòϵͳ²Å»áÖ´ÐÐÖ±ÕýµÄɾ³ý²Ù×÷£¬°ÑÎļþËùÕ¼ÓõĴÅÅÌÇøÓò±ê¼Ç³ÉδÓá£
ÎÒÃÇΪʲôÐèÒªÒýÓüÆÊý
´ÓÉÏÃæÄǸö¼òµ¥µÄÀý×ÓÖУ¬ÎÒÃÇ»¹¿´²»³öÀ´ÒýÓüÆÊýÕæÕýµÄÓô¦¡£ÒòΪ¸Ã¶ÔÏóµÄÉúÃüÆÚÖ»ÊÇÔÚÒ»¸öº¯ÊýÄÚ£¬ËùÒÔÔÚÕæÊµµÄÓ¦Óó¡¾°Ï£¬ÎÒÃÇÔÚº¯ÊýÄÚʹÓÃÒ»¸öÁÙʱµÄ¶ÔÏó£¬Í¨³£ÊDz»ÐèÒªÐÞ¸ÄËüµÄÒýÓüÆÊýµÄ£¬Ö»ÐèÒªÔÚº¯Êý·µ»ØÇ°½«¸Ã¶ÔÏóÏú»Ù¼´¿É¡£
ÒýÓüÆÊýÕæÕýÅÉÉÏÓó¡µÄ³¡¾°ÊÇÔÚÃæÏò¶ÔÏóµÄ³ÌÐòÉè¼Æ¼Ü¹¹ÖУ¬ÓÃÓÚ¶ÔÏóÖ®¼ä´«µÝºÍ¹²ÏíÊý¾Ý¡£ÎÒÃǾÙÒ»¸ö¾ßÌåµÄÀý×Ó£º
¼ÙÈç¶ÔÏó A Éú³ÉÁËÒ»¸ö¶ÔÏó M£¬ÐèÒªµ÷ÓöÔÏó B µÄijһ¸ö·½·¨£¬½«¶ÔÏó M ×÷Ϊ²ÎÊý´«µÝ¹ýÈ¥¡£ÔÚûÓÐÒýÓüÆÊýµÄÇé¿öÏ£¬Ò»°ãÄÚ´æ¹ÜÀíµÄÔÔòÊÇ
¡°ËÉêÇëËÊÍ·Å¡±£¬ÄÇô¶ÔÏó A ¾ÍÐèÒªÔÚ¶ÔÏó B ²»ÔÙÐèÒª¶ÔÏó M µÄʱºò£¬½«¶ÔÏó M Ïú»Ù¡£µ«¶ÔÏó B
¿ÉÄÜÖ»ÊÇÁÙʱÓÃһ϶ÔÏó M£¬Ò²¿ÉÄܾõµÃ¶ÔÏó M ºÜÖØÒª£¬½«ËüÉèÖóÉ×Ô¼ºµÄÒ»¸ö³ÉÔ±±äÁ¿£¬ÄÇÕâÖÖÇé¿öÏ£¬Ê²Ã´Ê±ºòÏú»Ù¶ÔÏó
M ¾Í³ÉÁËÒ»¸öÄÑÌâ¡£

¶ÔÓÚÕâÖÖÇé¿ö£¬ÓÐÒ»¸ö±©Á¦µÄ×ö·¨£¬¾ÍÊǶÔÏó A ÔÚµ÷ÓÃÍê¶ÔÏó B Ö®ºó£¬ÂíÉϾÍÏú»Ù²ÎÊý¶ÔÏó M£¬È»ºó¶ÔÏó
B ÐèÒª½«²ÎÊýÁíÍâ¸´ÖÆÒ»·Ý£¬Éú³ÉÁíÒ»¸ö¶ÔÏó M2£¬È»ºó×Ô¼º¹ÜÀí¶ÔÏó M2 µÄÉúÃüÆÚ¡£µ«ÊÇÕâÖÖ×ö·¨ÓÐÒ»¸öºÜ´óµÄÎÊÌ⣬¾ÍÊÇËü´øÀ´Á˸ü¶àµÄÄÚ´æÉêÇë¡¢¸´ÖÆ¡¢ÊͷŵŤ×÷¡£±¾À´Ò»¸ö¿ÉÒÔ¸´ÓõĶÔÏó£¬ÒòΪ²»·½±ã¹ÜÀíËüµÄÉúÃüÆÚ£¬¾Í¼òµ¥µÄ°ÑËüÏú»Ù£¬ÓÖÖØÐ¹¹ÔìÒ»·ÝÒ»ÑùµÄ£¬ÊµÔÚ̫ӰÏìÐÔÄÜ¡£ÈçÏÂͼËùʾ£º

ÎÒÃÇÁíÍ⻹ÓÐÒ»ÖÖ°ì·¨£¬¾ÍÊǶÔÏó A ÔÚ¹¹ÔìÍê¶ÔÏó M Ö®ºó£¬Ê¼ÖÕ²»Ïú»Ù¶ÔÏó M£¬ÓɶÔÏó B À´Íê³É¶ÔÏó
M µÄÏú»Ù¹¤×÷¡£Èç¹û¶ÔÏó B ÐèÒª³¤Ê±¼äʹÓöÔÏó M£¬Ëü¾Í²»Ïú»ÙËü£¬Èç¹ûÖ»ÊÇÁÙʱÓÃһϣ¬Ôò¿ÉÒÔÓÃÍêºóÂíÉÏÏú»Ù¡£ÕâÖÖ×ö·¨¿´Ëƺܺõؽâ¾öÁ˶ÔÏó¸´ÖƵÄÎÊÌ⣬µ«ÊÇËüÇ¿ÁÒÒÀÀµÓÚ
AB Á½¸ö¶ÔÏóµÄÅäºÏ£¬´úÂëά»¤ÕßÐèÒªÃ÷È·µØ¼ÇסÕâÖÖ±à³ÌÔ¼¶¨¡£¶øÇÒ£¬ÓÉÓÚ¶ÔÏó M µÄÉêÇëÊÇÔÚ¶ÔÏó A ÖУ¬ÊÍ·ÅÔÚ¶ÔÏó
B ÖУ¬Ê¹µÃËüµÄÄÚ´æ¹ÜÀí´úÂë·ÖÉ¢ÔÚ²»Í¬¶ÔÏóÖУ¬¹ÜÀíÆðÀ´Ò²·Ç³£·Ñ¾¢¡£Èç¹ûÕâ¸öʱºòÇé¿öÔÙ¸´ÔÓһЩ£¬ÀýÈç¶ÔÏó
B ÐèÒªÔÙÏò¶ÔÏó C ´«µÝ¶ÔÏó M£¬ÄÇôÕâ¸ö¶ÔÏóÔÚ¶ÔÏó C ÖÐÓÖ²»ÄÜÈöÔÏó C ¹ÜÀí¡£ËùÒÔÕâÖÖ·½Ê½´øÀ´µÄ¸´ÔÓÐÔ¸ü´ó£¬¸ü²»¿ÉÈ¡¡£

ËùÒÔÒýÓüÆÊýºÜºÃµÄ½â¾öÁËÕâ¸öÎÊÌ⣬ÔÚ²ÎÊý M µÄ´«µÝ¹ý³ÌÖУ¬ÄÄЩ¶ÔÏóÐèÒª³¤Ê±¼äʹÓÃÕâ¸ö¶ÔÏ󣬾ͰÑËüµÄÒýÓüÆÊý¼Ó
1£¬Ê¹ÓÃÍêÁËÖ®ºóÔÙ°ÑÒýÓüÆÊý¼õ 1¡£ËùÓжÔÏó¶¼×ñÊØÕâ¸ö¹æÔòµÄ»°£¬¶ÔÏóµÄÉúÃüÆÚ¹ÜÀí¾Í¿ÉÒÔÍêÈ«½»¸øÒýÓüÆÊýÁË¡£ÎÒÃÇÒ²¿ÉÒԺܷ½±ãµØÏíÊܵ½¹²Ïí¶ÔÏó´øÀ´µÄºÃ´¦¡£
²»ÒªÏòÒѾÊͷŵĶÔÏó·¢ËÍÏûÏ¢
ÓÐЩͬѧÏë²âÊÔµ±¶ÔÏóÊÍ·Åʱ£¬Æä retainCount ÊÇ·ñ±ä³ÉÁË 0£¬ËûÃǵÄÊÔÑé´úÂëÈçÏ£º
- (BOOL)application:(UIApplication *) application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSObject *object = [[NSObject alloc] init]; NSLog(@"Reference Count = %u", [object retainCount]); [object release]; NSLog(@"Reference Count = %u", [object retainCount]); return YES; } |
µ«ÊÇ£¬Èç¹ûÄãÕæµÄÕâôʵÑ飬ÄãµÃµ½µÄÊä³ö½á¹û¿ÉÄÜÊÇÒÔÏÂÕâÑù£º
Reference Count = 1 Reference Count = 1 |
ÎÒÃÇ×¢Òâµ½£¬×îºóÒ»´ÎÊä³ö£¬ÒýÓüÆÊý²¢Ã»Óбä³É 0¡£ÕâÊÇÎªÊ²Ã´ÄØ£¿ÒòΪ¸Ã¶ÔÏóµÄÄÚ´æÒѾ±»»ØÊÕ£¬¶øÎÒÃÇÏòÒ»¸öÒѾ±»»ØÊյĶÔÏó·¢ÁËÒ»¸ö
retainCount ÏûÏ¢£¬ËùÒÔËüµÄÊä³ö½á¹ûÓ¦¸ÃÊDz»È·¶¨µÄ£¬Èç¹û¸Ã¶ÔÏóËùÕ¼µÄÄÚ´æ±»¸´ÓÃÁË£¬ÄÇô¾ÍÓпÉÄÜÔì³É³ÌÐòÒì³£±ÀÀ£¡£
ÄÇΪʲôÔÚÕâ¸ö¶ÔÏó±»»ØÊÕÖ®ºó£¬Õâ¸ö²»È·¶¨µÄÖµÊÇ 1 ¶ø²»ÊÇ 0 ÄØ£¿ÕâÊÇÒòΪµ±×îºóÒ»´ÎÖ´ÐÐ release
ʱ£¬ÏµÍ³ÖªµÀÂíÉϾÍÒª»ØÊÕÄÚ´æÁË£¬¾ÍûÓбØÒªÔÙ½« retainCount ¼õ 1 ÁË£¬ÒòΪ²»¹Ü¼õ²»¼õ 1£¬¸Ã¶ÔÏ󶼿϶¨»á±»»ØÊÕ£¬¶ø¶ÔÏó±»»ØÊÕºó£¬ËüµÄËùÓеÄÄÚ´æÇøÓò£¬°üÀ¨
retainCount ÖµÒ²±äµÃûÓÐÒâÒå¡£²»½«Õâ¸öÖµ´Ó 1 ±ä³É 0£¬¿ÉÒÔ¼õÉÙÒ»´ÎÄÚ´æµÄд²Ù×÷£¬¼ÓËÙ¶ÔÏóµÄ»ØÊÕ¡£
ÄÃÎÒÃÇ֮ǰÌáµ½µÄ Linux Îļþϵͳ¾ÙÁУ¬Linux ÎļþϵͳÏÂɾ³ýÒ»¸öÎļþ£¬Ò²²»ÊÇÕæÕýµÄ½«ÎļþµÄ´ÅÅÌÇøÓò½øÐÐĨ³ý²Ù×÷£¬¶øÖ»ÊÇɾ³ý¸ÃÎļþµÄË÷Òý½ÚµãºÅ¡£ÕâÒ²ºÍÒýÓüÆÊýµÄÄÚ´æ»ØÊÕ·½Ê½ÀàËÆ£¬¼´»ØÊÕʱֻ×ö±ê¼Ç£¬²¢²»Ä¨³ýÏà¹ØµÄÊý¾Ý¡£
ARC ϵÄÄÚ´æ¹ÜÀíÎÊÌâ
ARC Äܹ»½â¾ö iOS ¿ª·¢ÖÐ 90% µÄÄÚ´æ¹ÜÀíÎÊÌ⣬µ«ÊÇÁíÍ⻹ÓÐ 10% ÄÚ´æ¹ÜÀí£¬ÊÇÐèÒª¿ª·¢Õß×Ô¼º´¦ÀíµÄ£¬ÕâÖ÷Òª¾ÍÊÇÓëµ×²ã
Core Foundation ¶ÔÏó½»»¥µÄÄDz¿·Ö£¬µ×²ãµÄ Core Foundation ¶ÔÏóÓÉÓÚ²»ÔÚ
ARC µÄ¹ÜÀíÏ£¬ËùÒÔÐèÒª×Ô¼ºÎ¬»¤ÕâЩ¶ÔÏóµÄÒýÓüÆÊý¡£
¶ÔÓÚ ARC äĿÒÀÀµµÄ iOS ÐÂÈËÃÇ£¬ÓÉÓÚ²»ÖªµÀÒýÓüÆÊý£¬ËûÃǵÄÎÊÌâÖ÷ÒªÌåÏÖÔÚ£º
¹ý¶ÈʹÓà block Ö®ºó£¬ÎÞ·¨½â¾öÑ»·ÒýÓÃÎÊÌâ¡£
Óöµ½µ×²ã Core Foundation ¶ÔÏó£¬ÐèÒª×Ô¼ºÊÖ¹¤¹ÜÀíËüÃǵÄÒýÓüÆÊýʱ£¬ÏÔµÃÒ»³ïĪչ¡£
Ñ»·ÒýÓã¨Reference Cycle£©ÎÊÌâ
ÒýÓüÆÊýÕâÖÖ¹ÜÀíÄÚ´æµÄ·½Ê½ËäÈ»ºÜ¼òµ¥£¬µ«ÊÇÓÐÒ»¸ö±È½Ï´óµÄ覴㬼´Ëü²»ÄܺܺõĽâ¾öÑ»·ÒýÓÃÎÊÌâ¡£ÈçÏÂͼËùʾ£º¶ÔÏó
A ºÍ¶ÔÏó B£¬Ï໥ÒýÓÃÁ˶Է½×÷Ϊ×Ô¼ºµÄ³ÉÔ±±äÁ¿£¬Ö»Óе±×Ô¼ºÏú»Ùʱ£¬²Å»á½«³ÉÔ±±äÁ¿µÄÒýÓüÆÊý¼õ 1¡£ÒòΪ¶ÔÏó
A µÄÏú»ÙÒÀÀµÓÚ¶ÔÏó B Ïú»Ù£¬¶ø¶ÔÏó B µÄÏú»ÙÓëÒÀÀµÓÚ¶ÔÏó A µÄÏú»Ù£¬ÕâÑù¾ÍÔì³ÉÁËÎÒÃdzÆÖ®ÎªÑ»·ÒýÓã¨Reference
Cycle£©µÄÎÊÌ⣬ÕâÁ½¸ö¶ÔÏó¼´Ê¹ÔÚÍâ½çÒѾûÓÐÈκÎÖ¸ÕëÄܹ»·ÃÎʵ½ËüÃÇÁË£¬ËüÃÇÒ²ÎÞ·¨±»ÊÍ·Å¡£

²»Ö¹Á½¶ÔÏó´æÔÚÑ»·ÒýÓÃÎÊÌ⣬¶à¸ö¶ÔÏóÒÀ´Î³ÖÓжԷ½£¬ÐÎʽһ¸ö»·×´£¬Ò²¿ÉÒÔÔì³ÉÑ»·ÒýÓÃÎÊÌ⣬¶øÇÒÔÚÕæÊµ±à³Ì»·¾³ÖУ¬»·Ô½´ó¾ÍÔ½Äѱ»·¢ÏÖ¡£ÏÂͼÊÇ
4 ¸ö¶ÔÏóÐγɵÄÑ»·ÒýÓÃÎÊÌâ¡£

Ö÷¶¯¶Ï¿ªÑ»·ÒýÓÃ
½â¾öÑ»·ÒýÓÃÎÊÌâÖ÷ÒªÓÐÁ½¸ö°ì·¨£¬µÚÒ»¸ö°ì·¨ÊÇÎÒÃ÷È·ÖªµÀÕâÀï»á´æÔÚÑ»·ÒýÓã¬ÔÚºÏÀíµÄλÖÃÖ÷¶¯¶Ï¿ª»·ÖеÄÒ»¸öÒýÓã¬Ê¹µÃ¶ÔÏóµÃÒÔ»ØÊÕ¡£ÈçÏÂͼËùʾ£º

Ö÷¶¯¶Ï¿ªÑ»·ÒýÓÃÕâÖÖ·½Ê½³£¼ûÓÚ¸÷ÖÖÓë block Ïà¹ØµÄ´úÂëÂß¼ÖС£ÀýÈçÔÚÎÒ¿ªÔ´µÄ YTKNetwork
ÍøÂç¿âÖУ¬ÍøÂçÇëÇóµÄ»Øµ÷ block ÊDZ»³ÖÓе쬵«ÊÇÈç¹ûÕâ¸ö block ÖÐÓÖ´æÔÚ¶ÔÓÚ View Controller
µÄÒýÓ㬾ͺÜÈÝÒײúÉú´ÓÑ»·ÒýÓã¬ÒòΪ£º
Controller ³ÖÓÐÁËÍøÂçÇëÇó¶ÔÏó
ÍøÂçÇëÇó¶ÔÏó³ÖÓÐÁ˻ص÷µÄ block
»Øµ÷µÄ block ÀïÃæÊ¹ÓÃÁË self£¬ËùÒÔ³ÖÓÐÁË Controller
½â¾ö°ì·¨¾ÍÊÇ£¬ÔÚÍøÂçÇëÇó½áÊøºó£¬ÍøÂçÇëÇó¶ÔÏóÖ´ÐÐÍê block Ö®ºó£¬Ö÷¶¯ÊͷŶÔÓÚ block µÄ³ÖÓУ¬ÒÔ±ã´òÆÆÑ»·ÒýÓá£Ïà¹ØµÄ´úÂë¼û£º
// https://github.com/yuantiku /YTKNetwork/blob/master/YTKNetwork/YTKBaseRequest.m // µÚ 147 ÐУº - (void)clearCompletionBlock { // Ö÷¶¯Êͷŵô¶ÔÓÚ block µÄÒýÓà self.successCompletionBlock = nil; self.failureCompletionBlock = nil; } |
²»¹ý£¬Ö÷¶¯¶Ï¿ªÑ»·ÒýÓÃÕâÖÖ²Ù×÷ÒÀÀµÓÚ³ÌÐòÔ±×Ô¼ºÊÖ¹¤ÏÔʽµØ¿ØÖÆ£¬Ï൱Óڻص½ÁËÒÔǰ ¡°ËÉêÇëËÊÍ·Å¡± µÄÄÚ´æ¹ÜÀíÄê´ú£¬ËüÒÀÀµÓÚ³ÌÐòÔ±×Ô¼ºÓÐÄÜÁ¦·¢ÏÖÑ»·ÒýÓò¢ÇÒÖªµÀÔÚʲôʱ»ú¶Ï¿ªÑ»·ÒýÓûØÊÕÄڴ棨Õâͨ³£Óë¾ßÌåµÄÒµÎñÂß¼Ïà¹Ø£©£¬ËùÒÔÕâÖÖ½â¾ö·½·¨²¢²»³£Ó㬸ü³£¼ûµÄ°ì·¨ÊÇʹÓÃÈõÒýÓÃ
(weak reference) µÄ°ì·¨¡£
ʹÓÃÈõÒýÓÃ
ÈõÒýÓÃËäÈ»³ÖÓжÔÏ󣬵«ÊDz¢²»Ôö¼ÓÒýÓüÆÊý£¬ÕâÑù¾Í±ÜÃâÁËÑ»·ÒýÓõIJúÉú¡£ÔÚ iOS ¿ª·¢ÖУ¬ÈõÒýÓÃͨ³£ÔÚ
delegate ģʽÖÐʹÓ᣾ٸöÀý×ÓÀ´Ëµ£¬Á½¸ö ViewController A ºÍ B£¬ViewController
A ÐèÒªµ¯³ö ViewController B£¬ÈÃÓû§ÊäÈëһЩÄÚÈÝ£¬µ±Óû§ÊäÈëÍê³Éºó£¬ViewController
B ÐèÒª½«ÄÚÈÝ·µ»Ø¸ø ViewController A¡£Õâ¸öʱºò£¬View Controller µÄ delegate
³ÉÔ±±äÁ¿Í¨³£ÊÇÒ»¸öÈõÒýÓã¬ÒÔ±ÜÃâÁ½¸ö ViewController Ï໥ÒýÓöԷ½Ôì³ÉÑ»·ÒýÓÃÎÊÌ⣬ÈçÏÂËùʾ£º

ÈõÒýÓõÄʵÏÖÔÀí
ÈõÒýÓõÄʵÏÖÔÀíÊÇÕâÑù£¬ÏµÍ³¶ÔÓÚÿһ¸öÓÐÈõÒýÓõĶÔÏ󣬶¼Î¬»¤Ò»¸ö±íÀ´¼Ç¼ËüËùÓеÄÈõÒýÓõÄÖ¸ÕëµØÖ·¡£ÕâÑù£¬µ±Ò»¸ö¶ÔÏóµÄÒýÓüÆÊýΪ
0 ʱ£¬ÏµÍ³¾Íͨ¹ýÕâÕÅ±í£¬ÕÒµ½ËùÓеÄÈõÒýÓÃÖ¸Õ룬¼Ì¶ø°ÑËüÃǶ¼ÖÃ³É nil¡£
´ÓÕâ¸öÔÀíÖУ¬ÎÒÃÇ¿ÉÒÔ¿´³ö£¬ÈõÒýÓõÄʹÓÃÊÇÓжîÍâµÄ¿ªÏúµÄ¡£ËäÈ»Õâ¸ö¿ªÏúºÜС£¬µ«ÊÇÈç¹ûÒ»¸öµØ·½ÎÒÃǿ϶¨Ëü²»ÐèÒªÈõÒýÓõÄÌØÐÔ£¬¾Í²»Ó¦¸ÃäĿʹÓÃÈõÒýÓ᣾ٸöÀý×Ó£¬ÓÐÈËϲ»¶ÔÚÊÖд½çÃæµÄʱºò£¬½«ËùÓнçÃæÔªËØ¶¼ÉèÖóÉ
weak µÄ£¬ÕâijÖ̶ֳÈÉÏÓë Xcode ͨ¹ý Storyboard ÍÏ×§Éú³ÉµÄбäÁ¿ÊÇÒ»Öµġ£µ«ÊÇÎÒ¸öÈËÈÏΪÕâÑù×ö²¢²»Ì«ºÏÊÊ¡£ÒòΪ£º
ÎÒÃÇÔÚ´´½¨Õâ¸ö¶ÔÏóʱ£¬ÐèҪעÒâÁÙʱʹÓÃÒ»¸öÇ¿ÒýÓóÖÓÐËü£¬·ñÔòÒòΪ weak ±äÁ¿²¢²»³ÖÓжÔÏ󣬾ͻáÔì³ÉÒ»¸ö¶ÔÏó¸Õ±»´´½¨¾ÍÏú»Ùµô¡£
´ó²¿·Ö ViewController µÄÊÓͼ¶ÔÏóµÄÉúÃüÖÜÆÚÓë ViewController ±¾ÉíÊÇÒ»Öµģ¬Ã»ÓбØÒª¶îÍâ×öÕâ¸öÊÂÇé¡£
ÔçÏÈÆ»¹ûÕâôÉè¼Æ£¬ÊÇÓÐÀúÊ·ÔÒòµÄ¡£ÔÚÔçÄ꣬µ±Ê±ÏµÍ³ÊÕµ½ Memory Warning µÄʱºò£¬ViewController
µÄ View »á±» unLoad µô¡£Õâ¸öʱºò£¬Ê¹Óà weak µÄÊÓͼ±äÁ¿ÊÇÓÐÓõģ¬¿ÉÒÔ±£³ÖÕâЩÄÚ´æ±»»ØÊÕ¡£µ«ÊÇÕâ¸öÉè¼ÆÒѾ±»·ÏÆúÁË£¬Ìæ´ú·½°¸Êǽ«Ïà¹ØÊÓͼµÄ
CALayer ¶ÔÓ¦µÄ CABackingStore ÀàÐ͵ÄÄÚ´æÇø»á±»±ê¼Ç³É Volatile ÀàÐÍ¡£
ʹÓà Xcode ¼ì²âÑ»·ÒýÓÃ
Xcode µÄ Instruments ¹¤¾ß¼¯¿ÉÒԺܷ½±ãµÄ¼ì²âÑ»·ÒýÓá£ÎªÁ˲âÊÔЧ¹û£¬ÎÒÃÇÔÚÒ»¸ö²âÊÔÓõÄ
ViewController ÖÐÌîÈëÒÔÏ´úÂ룬¸Ã´úÂëÖÐµÄ firstArray ºÍ secondArray
Ï໥ÒýÓÃÁ˶Է½£¬¹¹³ÉÁËÑ»·ÒýÓá£
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *firstArray = [NSMutableArray array]; NSMutableArray *secondArray = [NSMutableArray array]; [firstArray addObject:secondArray]; [secondArray addObject:firstArray]; } |
ÔÚ Xcode µÄ²Ëµ¥À¸Ñ¡Ôñ£ºProduct -> Profile£¬È»ºóÑ¡Ôñ ¡°Leaks¡±£¬ÔÙµã»÷ÓÒϽǵġ±Profile¡±
°´Å¥¿ªÊ¼¼ì²â¡£ÈçÏÂͼ

Õâ¸öʱºò iOS Ä£ÄâÆ÷»áÔËÐÐÆðÀ´£¬ÎÒÃÇÔÚÄ£ÄâÆ÷Àï½øÐÐһЩ½çÃæµÄÇл»²Ù×÷¡£ÉԵȼ¸ÃëÖÓ£¬¾Í¿ÉÒÔ¿´µ½ Instruments
¼ì²âµ½ÁËÎÒÃǵÄÕâ´ÎÑ»·ÒýÓá£Instruments ÖлáÓÃÒ»ÌõºìÉ«µÄÌõÀ´±íʾһ´ÎÄÚ´æÐ¹Â©µÄ²úÉú¡£ÈçÏÂͼËùʾ£º

ÎÒÃÇ¿ÉÒÔÇл»µ½ Leaks ÕâÀ¸£¬µã»÷¡±Cycles & Roots¡±£¬¾Í¿ÉÒÔ¿´µ½ÒÔͼÐη½Ê½ÏÔʾ³öÀ´µÄÑ»·ÒýÓá£ÕâÑùÎÒÃǾͿÉÒԷdz£·½±ãµØÕÒµ½Ñ»·ÒýÓõĶÔÏóÁË¡£

Core Foundation ¶ÔÏóµÄÄÚ´æ¹ÜÀí
ÏÂÃæÎÒÃǾÍÀ´¼òµ¥½éÉÜһ϶Եײã Core Foundation ¶ÔÏóµÄÄÚ´æ¹ÜÀí¡£µ×²ãµÄ Core Foundation
¶ÔÏó£¬ÔÚ´´½¨Ê±´ó¶àÒÔ XxxCreateWithXxx ÕâÑùµÄ·½Ê½´´½¨£¬ÀýÈ磺
// ´´½¨Ò»¸ö CFStringRef ¶ÔÏó CFStringRef str= CFStringCreateWithCString(kCFAllocatorDefault, ¡°hello world", kCFStringEncodingUTF8);
// ´´½¨Ò»¸ö CTFontRef ¶ÔÏó
CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT",
fontSize, NULL); |
¶ÔÓÚÕâЩ¶ÔÏóµÄÒýÓüÆÊýµÄÐ޸ģ¬ÒªÏàÓ¦µÄʹÓà CFRetain ºÍ CFRelease ·½·¨¡£ÈçÏÂËùʾ£º
// ´´½¨Ò»¸ö CTFontRef ¶ÔÏó CTFontRef fontRef = CTFontCreateWithName ((CFStringRef)@"ArialMT", fontSize, NULL);
// ÒýÓüÆÊý¼Ó 1
CFRetain(fontRef);
// ÒýÓüÆÊý¼õ 1
CFRelease(fontRef); |
¶ÔÓÚ CFRetain ºÍ CFRelease Á½¸ö·½·¨£¬¶ÁÕß¿ÉÒÔÖ±¹ÛµØÈÏΪ£¬ÕâÓë Objective-C
¶ÔÏóµÄ retain ºÍ release ·½·¨µÈ¼Û¡£
ËùÒÔ¶ÔÓڵײã Core Foundation ¶ÔÏó£¬ÎÒÃÇÖ»ÐèÒªÑÓÐøÒÔǰÊÖ¹¤¹ÜÀíÒýÓüÆÊýµÄ°ì·¨¼´¿É¡£
³ý´ËÖ®Í⣬»¹ÓÐÁíÍâÒ»¸öÎÊÌâÐèÒª½â¾ö¡£ÔÚ ARC Ï£¬ÎÒÃÇÓÐʱÐèÒª½«Ò»¸ö Core Foundation
¶ÔÏóת»»³ÉÒ»¸ö Objective-C ¶ÔÏó£¬Õâ¸öʱºòÎÒÃÇÐèÒª¸æËß±àÒëÆ÷£¬×ª»»¹ý³ÌÖеÄÒýÓüÆÊýÐèÒª×öÈçºÎµÄµ÷Õû¡£Õâ¾ÍÒýÈëÁËbridgeÏà¹ØµÄ¹Ø¼ü×Ö£¬ÒÔÏÂÊÇÕâЩ¹Ø¼ü×ÖµÄ˵Ã÷£º
__bridge: Ö»×öÀàÐÍת»»£¬²»ÐÞ¸ÄÏà¹Ø¶ÔÏóµÄÒýÓüÆÊý£¬ÔÀ´µÄ Core Foundation ¶ÔÏóÔÚ²»ÓÃʱ£¬ÐèÒªµ÷ÓÃ
CFRelease ·½·¨¡£
__bridge_retained£ºÀàÐÍת»»ºó£¬½«Ïà¹Ø¶ÔÏóµÄÒýÓüÆÊý¼Ó 1£¬ÔÀ´µÄ Core Foundation
¶ÔÏóÔÚ²»ÓÃʱ£¬ÐèÒªµ÷Óà CFRelease ·½·¨¡£
__bridge_transfer£ºÀàÐÍת»»ºó£¬½«¸Ã¶ÔÏóµÄÒýÓüÆÊý½»¸ø ARC ¹ÜÀí£¬Core Foundation
¶ÔÏóÔÚ²»ÓÃʱ£¬²»ÔÙÐèÒªµ÷Óà CFRelease ·½·¨¡£
ÎÒÃǸù¾Ý¾ßÌåµÄÒµÎñÂß¼£¬ºÏÀíʹÓÃÉÏÃæµÄ 3 ÖÖת»»¹Ø¼ü×Ö£¬¾Í¿ÉÒÔ½â¾ö Core Foundation ¶ÔÏóÓë
Objective-C ¶ÔÏóÏà¶Ôת»»µÄÎÊÌâÁË¡£
×ܽá
ÔÚ ARC µÄ°ïÖúÏ£¬iOS ¿ª·¢ÕßµÄÄÚ´æ¹ÜÀí¹¤×÷ÒѾ±»´ó´ó¼õÇᣬµ«ÊÇÎÒÃÇÈÔÈ»ÐèÒªÀí½âÒýÓüÆÊýÕâÖÖÄÚ´æ¹ÜÀí·½Ê½µÄÓŵãºÍ³£¼ûÎÊÌâ£¬ÌØ±ðҪעÒâ½â¾öÑ»·ÒýÓÃÎÊÌâ¡£¶ÔÓÚÑ»·ÒýÓÃÎÊÌâÓÐÁ½ÖÖÖ÷ÒªµÄ½â¾ö°ì·¨£¬Ò»ÊÇÖ÷¶¯¶Ï¿ªÑ»·ÒýÓ㬶þÊÇʹÓÃÈõÒýÓõķ½Ê½±ÜÃâÑ»·ÒýÓ᣶ÔÓÚ
Core Foundation ¶ÔÏó£¬ÓÉÓÚ²»ÔÚ ARC ¹ÜÀí֮ϣ¬ÎÒÃÇÈÔÈ»ÐèÒªÑÓÐøÒÔǰÊÖ¹¤¹ÜÀíÒýÓüÆÊýµÄ°ì·¨¡£
ÔÚµ÷ÊÔÄÚ´æÎÊÌâʱ£¬Instruments ¹¤¾ß¿ÉÒԺܺõضÔÎÒÃǽøÐи¨Öú£¬ÉÆÓà Instruments
¿ÉÒÔ½ÚÊ¡ÎÒÃÇ´óÁ¿µÄµ÷ÊÔʱ¼ä¡£
Ըÿһ¸ö iOS ¿ª·¢Õß¶¼¿ÉÒÔÕÆÎÕ iOS µÄÄÚ´æ¹ÜÀí¼¼ÄÜ¡£ |