Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Àí½â iOS µÄÄÚ´æ¹ÜÀí
 
×÷ÕߣºÌÆÇÉ  À´Ô´£º²©¿Í ·¢²¼ÓÚ£º 2016-10-13
  1404  次浏览      28
 

Ô¶¹Åʱ´úµÄ¹ÊÊÂ

ÄÇЩ¾­Àú¹ýÊÖ¹¤¹ÜÀíÄڴ棨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 µÄÄÚ´æ¹ÜÀí¼¼ÄÜ¡£

   
1404 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ