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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ARCÖÐRetain Cycle½ÒÃØ
 
×÷ÕߣºIgnacio Nieto Carvajal À´Ô´£ºDigital Leaves ·¢²¼ÓÚ£º 2015-05-29
  2993  次浏览      37
 

ÕªÒª£º¶ÔÐí¶à¿ª·¢Õß¶øÑÔ£¬ARC×îÁîÈËʧÍûÖ®´¦Äª¹ýÓÚÆ»¹û¹«Ë¾ÈÃARCÀ´¹ÜÀíÄÚ´æ¡£²»ÐÒµÄÊÇARCûÓÐÑ­»·ÒýÓüì²âÆ÷£¬Òò´ËºÜÈÝÒ׳öÏÖRetain CycleÏÖÏ󣬴ӶøÆÈʹ¿ª·¢ÕßÔÚ±àÂëʱҪ²ÉÈ¡ÌØÊâµÄÔ¤·À´ëÊ©¡£

ARCÖеÄRetain Cycle¾ÍÏñÈÕ±¾B¼¶¿Ö²ÀµçÓ°Ò»Ñù¡£¿ªÊ¼Ê¹ÓÃCocoa»òCocoa Touch×ö¿ª·¢Ê±£¬ÄãÉõÖÁ²»»áÔÚÒâËüµÄ´æÔÚ¡£Ö±µ½ÓÐÒ»ÌìÓ¦ÓóÌÐòÓÉÓÚÄÚ´æÐ¹Â©¶ø³öÏÖÁ˱ÀÀ£ÏÖÏó£¬Äã²ÅÒâʶµ½ËüÃǵĴæÔÚ£¬¿´µ½ÏñÓÄÁéÒ»ÑùµÄRetain CycleÎÞ´¦²»ÔÚ¡£Ëæ×ÅËêÔÂÁ÷ÊÅ£¬Äãѧ»áÊÊÓ¦ËüÃÇ£¬·¢ÏÖËüÃÇ£¬±ÜÃâËüÃÇ¡­¡­µ«×îÖտֻݹÔÚ£¬Î޿ײ»Èë¡£

°üÀ¨ÎÒÔÚÄÚ£¬¶ÔÓÚÐí¶à¿ª·¢ÈËÔ±À´Ëµ£¬ARCµÄ×îÁîÈËʧÍûÖ®´¦Äª¹ýÓÚÆ»¹û¹«Ë¾ÈÃARCÀ´¹ÜÀíÄÚ´æ¡£²»ÐÒµÄÊÇARCûÓÐÑ­»·ÒýÓüì²âÆ÷£¬Òò´ËºÜÈÝÒ׳öÏÖRetain CycleÏÖÏ󣬴ӶøÆÈʹ¿ª·¢ÈËÔ±ÔÚ±àÂëʱҪ²ÉÈ¡ÌØÊâµÄÔ¤·À´ëÊ©¡£

¶ÔÓÚiOS¿ª·¢ÈËÔ±À´Ëµ£¬Retain CycleÊǸöÄѵ㡣ÔÚÍøÉÏÓкܶàÎóµ¼ÐÅÏ¢[1][2]£¬ÈËÃÇËù¸ø³öµÄÕâЩ´íÎóÐÅÏ¢ºÍÐÞ¸´·½·¨ÉõÖÁ»áµ¼ÖÂÓ¦ÓóöÏÖеÄÎÊÌ⣬ÉõÖÁ±ÀÀ£µô£¬»ùÓÚÕâÑùµÄÇé¿ö£¬±¾ÎÄÖÐÎÒ»á²ûÃ÷Ö÷Ì⣬¸ø¶ÁÕßһЩÆô·¢¡£

Ïà¹ØÀíÂÛһƳ

Cocoa¿ò¼ÜÄÚ´æ¹ÜÀí¿ÉÒÔ×·Ëݵ½MRR£¨Manual Retain Release£©£¬ÔÚMRRÖУ¬¿ª·¢ÈËÔ±ÔÚ´´½¨¶ÔÏóµÄʱºò£¬ÒªÎªÃ¿¸öÄÚ´æÖеĶÔÏóÉùÃ÷ËùÓÐȨ¡£²¢ÇÒ£¬µ±²»ÔÙÐèÒª¸Ã¶ÔÏóʱ£¬Òª·ÅÆúËùÓÐȨ¡£MRRͨ¹ýÒýÓüÆÊýϵͳÀ´ÊµÏÖÕâÖÖËùÓÐȨ»úÖÆ¡£Ã¿¸ö¶ÔÏó¶¼±»·ÖÅäÒ»¸ö¼ÆÊýÆ÷ָʾ±»¡°ÓµÓС±Á˶àÉٴΣ¬Ã¿´Î¼ÓÒ»£¬ÊͷŶÔÏóµÄʱºòÿ´Î¼õÒ»¡£µ±ÒýÓüÆÊý±ä³ÉÁãµÄʱºò£¬¸Ã¶ÔÏ󽫲»¸´´æÔÚ¡£¶ÔÓÚ¿ª·¢ÈËÔ±À´Ëµ£¬²»µÃ²»ÊÖ¶¯Î¬»¤ÒýÓüÆÊýÕæµÄÊǺܷ³È˵ÄÊÂÇ飬ÓÚÊÇÆ»¹û¹«Ë¾ÒýÈëÁË×Ô¶¯ÒýÓüÆÊý£¨Automated Reference Counting, ARC£©»úÖÆ£¬ÃâµÃ¿ª·¢ÈËÔ±ÊÖ¶¯Ìí¼Ó±£Áô£¨retain£©ºÍÊÍ·Å£¨release£©Ö¸ÁÈÃËûÃÇרעÓÚ½â¾öÓ¦ÓóÌÐòµÄÎÊÌâ¡£ÔÚARC»·¾³Ï£¬¿ª·¢ÈËÔ±Òª½«Ò»¸ö±äÁ¿¶¨ÒåΪ¡°strong¡±»ò¡°weak¡±¡£Ê¹ÓÃweakµÄ»°Ó¦ÓóÌÐòÖб»ÉùÃ÷µÄ¶ÔÏ󲻻ᱻretain£¬¶øÊ¹ÓÃstrongÉùÃ÷µÄ¶ÔÏ󽫻ᱻretain£¬²¢ÇÒÆäÒýÓüÆÊý¼ÓÒ»¡£

ΪʲôҪÔÚºõ£¿

ARCµÄÎÊÌâÔÚÓÚÈÝÒ×µ¼ÖÂRetain Cycle£¬Ëü·¢ÉúÔÚÁ½¸ö²»Í¬µÄ¶ÔÏó¼ä±Ë´Ë°üº¬Ç¿ÒýÓõÄʱºò¡£ÊÔÏëÒ»¸öBook¶ÔÏó°üº¬Ò»ÏµÁеÄPage¶ÔÏó£¬Ã¿¸öPage¶ÔÏóÓиöÊôÐÔÖ¸Ïò¸ÃÒ³ËùÔÚµÄÕâ±¾Êé¡£µ±ÄãÊͷŵôÖ¸ÏòBookºÍPageµÄ±äÁ¿Ê±£¬BookºÍPageÖ®¼ä»¹´æÔÚ×ÅÇ¿ÒýÓá£Òò´Ë£¬¼´Ê¹Ã»ÓбäÁ¿Ö¸ÏòBookºÍPageÁË£¬BookºÍPage¼°ÆäËùÕ¼ÓõÄÄÚ´æÒ²²»»á±»Êͷŵô¡£

²»ÐÒÖ®´¦ÔÚÓÚ²¢·ÇËùÓÐRetain Cycle¶¼ºÜÈÝÒ×±»·¢ÏÖ¡£¶ÔÏóÖ®¼äµÄ´«µÝ¹ØÏµ£¨AÒýÓÃB£¬Bת¶øÒýÓÃC£¬CÒýÓÃA£©»áµ¼ÖÂRetain Cycle¡£¸üÔã¸âµÄÊÇObjective-CÀïµÄ¿é£¨block£©ºÍSwiftÀïµÄ±Õ°ü£¨closure£©¶¼±»ÈÏΪÊǶÀÁ¢µÄÄÚ´æ¶ÔÏó¡£Òò´Ë£¬ÈκÎÔÚ¿é»ò±Õ°üÄÚ¶ÔÏñµÄÒýÓö¼½«»á¶ÔÆä±äÁ¿×öretain²Ù×÷¡£Òò´Ë£¬Èç¹û¶ÔÏóÈÔÈ»retainÕâ¸ö¿éµÄ»°£¬¾Í»áµ¼ÖÂDZÔÚµÄRetain Cycle·¢Éú¡£

Retain Cycle¿ÉÒÔ³ÉΪӦÓóÌÐòDZÔÚµÄΣº¦£¬µ¼ÖÂÄÚ´æÏûºÄ¹ý¸ß£¬ÐÔÄܵÍϺͱÀÀ£¡£µ«»¹Ã»ÓÐÀ´×ÔÓÚÆ»¹û¹«Ë¾µÄÎĵµ£¬Õë¶ÔRetain Cycle¿ÉÄÜ·¢ÉúµÄ²»Í¬³¡¾°£¬ÒÔ¼°ÈçºÎ±ÜÃâ½øÐÐÃèÊö¡£Õâµ¼ÖÂÁËһЩÎó½â²¢ÐγÉÁ˲»Á¼µÄ±à³Ìϰ¹ß¡£

ÓÃÀý³¡¾°

ÄÇôÏл°ÉÙ˵£¬ÎÒÃÇÒ»ÆðÀ´·ÖÎöһЩ³¡¾°£¬È·¶¨ËüÃÇÊÇ·ñ»áµ¼ÖÂRetain CycleÒÔ¼°ÈçºÎ±ÜÃ⣺

¸¸×Ó¶ÔÏó¹ØÏµ

ÕâÊÇRetain CycleµÄµäÐÍÀý×Ó¡£²»ÐÒµÄÊÇÕâÒ²ÊÇÆ»¹û¹«Ë¾Î¨Ò»¸ø³öÏà¹Ø½â¾ö·½°¸ÎĵµµÄÀý×Ó¡£¾ÍÊÇÎÒÉÏÃæÃèÊöµÄBookºÍPage¶ÔÏóµÄÀý×Ó¡£ÕâÖÖÇé¿öµÄµäÐͽâ¾ö·½°¸ÊǰÑChildÀàÀïÃæµÄ´ú±í¸¸ÀàµÄ±äÁ¿¶¨Òå³Éweak£¬ÕâÑù¾Í¿ÉÒÔ±ÜÃâRetain Cycle¡£

class Parent {  
var name: String
var child: Child?
init(name: String) {
self.name = name
}
}
class Child {
var name: String
weak var parent: Parent!
init(name: String, parent: Parent) {
self.name = name
self.parent = parent
}
}

ÔÚSwiftÓïÑÔÖУ¬´ú±í¸¸ÀàµÄ±äÁ¿ÊǸöÈõ±äÁ¿µÄÊÂʵÆÈʹÎÒÃǽ«Æä¶¨ÒåΪ¿ÉÑ¡ÀàÐÍ¡£²»Ê¹ÓÿÉÑ¡ÀàÐ͵ÄÁíÒ»ÖÖ×ö·¨Êǽ«¸¸ÀàÐͶÔÏóÉùÃ÷Ϊ¡°unowned¡±£¨Òâζ×ÅÎÒÃDz»»á¶Ô±äÁ¿ÉùÃ÷½øÐÐÄÚ´æ¹ÜÀí»òÉùÃ÷ËùÓÐȨ£©¡£È»¶øÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃDZØÐë·Ç³£×ÐϸµØÈ·±£Ö»ÓÐÒ»¸öChildʵÀýÖ¸ÏòParent£¬Parent¾Í²»ÄÜÊÇnil£¬·ñÔò³ÌÐò¾Í»á±ÀÀ££º

class Parent {  
var name: String
var child: Child?
init(name: String) {
self.name = name
}
}
class Child {
var name: String
unowned var parent: Parent
init(name: String, parent: Parent) {
self.name = name
self.parent = parent
}
}
var parent: Parent! = Parent(name: "John")
var child: Child! = Child(name: "Alan", parent: parent)
parent = nil
child.parent <== possible crash here!

Ò»°ãÀ´Ëµ¹«ÈϵÄ×ö·¨ÊǸ¸¶ÔÏó±ØÐëÓµÓУ¨Ç¿ÒýÓã©Æä×Ó¶ÔÏó£¬ÕâЩ×Ó¶ÔÏó¶ÔÆä¸¸¶ÔÏóÓ¦¸ÃÖ»±£³ÖÒ»¸öÈõÒýÓá£ÕâͬÑùÊÊÓÃÓÚ¼¯ºÏ£¬¼¯ºÏ±ØÐëÓµÓÐÆäËù°üº¬µÄ¶ÔÏó¡£

°üº¬ÔÚʵÀý±äÁ¿ÖеĿéºÍ±Õ°ü

ÁíÒ»¸ö¾­µäµÄÀý×ÓËäÈ»²»ÊÇÄÇôֱ¹Û£¬µ«ÕýÈçÎÒÃÇ֮ǰËù˵µÄÄÇÑù£¬±Õ°üºÍ¿éÊǶÀÁ¢µÄÄÚ´æ¶ÔÏ󣬲¢retainÁËËüÃÇËùÒýÓõĶÔÏó¡£Òò´ËÈç¹ûÎÒÃÇÓÐÒ»¸ö°üº¬±Õ°ü±äÁ¿µÄÀ࣬Õâ¸ö±äÁ¿ÓÖÇ¡ºÃÒýÓÃÁËÆäËùÓµÓжÔÏóµÄÊôÐÔ»ò·½·¨£¬ÓÉÓÚ±Õ°üͨ¹ý´´½¨Ò»¸öÇ¿ÒýÓöø¡°²¶»ñ¡±ÁË×Ô¼º£¬¾Í»áÓÐRetain Cycle·¢Éú¡£

class MyClass {  
lazy var myClosureVar = {
self.doSomething()
}
}

ÕâÖÖÇé¿öϵĽâ¾ö·½·¨Êǽ«×ÔÉí¶¨Òå³É¡°weak¡±°æ±¾£¬²¢ÇÒ½«´ËÈõÒýÓø³¸ø±Õ°ü»ò¿é¡£ÔÚObjective-CÓïÑÔÖУ¬Òª¶¨Òå¸öеıäÁ¿£º

- (id) init() {  
__weak MyClass * weakSelf = self;
self.myClosureVar = ^{
[weakSelf doSomething];
}
}

¶øÔÚSwiftÓïÑÔÖУ¬ÎÒÃÇÖ»ÐèÒªÖ¸¶¨¡°[weak self] in¡±×÷Ϊ±Õ°üµÄÆô¶¯²ÎÊý£º

var myClosureVar = {  
[weak self] in
self?.doSomething()
}

ÕâÑùÒ»À´£¬µ±±Õ°ü¿ìÖ´ÐÐÍê±Ïʱ£¬self±äÁ¿²»»á±»Ç¿ÖÆretain£¬Òò´Ë»áµÃµ½ÊÍ·Å£¬´òÆÆÑ­»·¡£×¢Ò⣬µ±ÉùÃ÷Ϊweakʱ£¬selfÔÚ±Õ°üÄÚÊÇÈçºÎ±ä³É¿ÉÑ¡ÀàÐ͵ġ£

GCDÖеÄdispatch_async

ÓëÒ»¹áµÄÈÏʶÏà·´£¬dispatch_async±¾Éí²¢²»»áµ¼ÖÂRetain Cycle¡£

dispatch_async(queue, { () -> Void in  
self.doSomething();
});

ÔÚÕâÀ±Õ°ü¶ÔselfÇ¿ÒýÓ㬵«ÊÇÀࣨself£©µÄʵÀý¶Ô±Õ°üûÓÐÈκÎÇ¿ÒýÓã¬Òò´ËÒ»µ©±Õ°ü½áÊø£¬Ëü½«±»ÊÍ·Å£¬Ò²²»»áÓл·³öÏÖ£¬È»¶ø£¬ÓеÄʱºò»á±»£¨´íÎ󵨣©ÈÏΪÕâÖÖÇé¿ö»áµ¼ÖÂRetain Cycle¡£Ò»Ð©¿ª·¢ÈËÔ±ÉõÖÁÒ»Õë¼ûѪµØÖ¸³ö½«¿é»ò±Õ°üÄÚËùÓжԡ°self¡±µÄÒýÓö¼ÉùÃ÷Ϊweak£º

dispatch_async(queue, {  
[weak self] in
self?.doSomething()
})

ÔÚÎÒ¿´À´£¬¶ÔÿÖÖÇé¿ö¶¼ÕâÑù×ö²¢²»ÊǺõÄ×ö·¨¡£ÎÒÃǼÙÉèij¸ö¶ÔÏóÆô¶¯ÁËÒ»¸ö³¤Ê±¼äµÄºǫ́ÈÎÎñ£¨±ÈÈç´ÓÍøÂçÉÏÏÂÔØÒ»Ð©¶«Î÷£©£¬È»ºóµ÷ÓÃÁËÒ»¸ö¡°self¡±·½·¨¡£Èç¹û¶Ôself´«µÝÒ»¸öÈõÒýÓõϰ£¬ÄÇôÀà»áÔÚ±Õ°ü½áÊøÖ®Ç°Íê³ÉËüµÄÉúÃüÖÜÆÚ¡£Òò´Ë£¬µ±µ÷Óà doSomething()µÄʱºò£¬ÀàµÄʵÀýÒѾ­²»´æÔÚÁË£¬ËùÒÔÕâ¸ö·½·¨ÓÀÔ¶²»»á±»Ö´ÐС£ÕâÖÖÇé¿öÏ£¬£¨Æ»¹û¹«Ë¾£©½¨ÒéµÄ½â¾ö·½°¸ÊǶԱհüÄÚµÄÈõÒýÓÃ(???)ÉùÃ÷Ò»¸öÇ¿ÒýÓãº

dispatch_async(queue, {  
[weak self] in
if let strongSelf = self {
strongSelf.doSomething()
}
})

ÎÒ²»½ö·¢ÏÖÓï·¨Èß³¤µ¥µ÷£¬È±·¦Ö±¹ÛÐÔ£¬ÉõÖÁÁîÈ˸е½Ñá¶ñ£¬¶øÇÒʹ±Õ°ü×÷Ϊ¶ÀÁ¢µÄ´¦ÀíʵÌåµÄ´òËãÒ²Âä¿ÕÁË¡£ÎÒÈÏΪҪÀí½â¶ÔÏóµÄÉúÃüÖÜÆÚ£¬È·ÇеØÃ÷°×ʲôʱºòÓ¦¸ÃΪʵÀýÉùÃ÷Ò»¸öÄÚ²¿µÄweak°æ£¬»¹ÒªÖªµÀ¶ÔÏó´æÐøÆÚ¼ä»áÓÐÄÄЩӰÏì¡£µ«»°ÓÖ˵»ØÀ´£¬ÕâÕýÊÇÎÒ½â¾öÓ¦ÓóÌÐòµÄÎÊÌâʱ·ÖÉ¢ÎÒ×¢ÒâÁ¦µÄµØ·½£¬Èç¹ûCocoa¿ò¼ÜÖÐûÓÐʹÓÃARCµÄ»°£¬ÕâЩ¶¼ÊÇûÓбØÒªÐ´µÄ´úÂë¡£

¾Ö²¿µÄ±Õ°üºÍ¿é

ûÓÐÒýÓûò°üº¬ÈκÎʵÀý»òÀà±äÁ¿µÄº¯Êý¾Ö²¿±Õ°üºÍ¿é±¾Éí²»»áµ¼ÖÂRetain Cycle¡£³£¼ûµÄÀý×Ó¾ÍÊÇUIViewµÄanimateWithDuration·½·¨£º

func myMethod() {  
...
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.someOutlet.alpha = 1.0
self.someMethod()
})
}

¶ÔÓÚdispatch_asyncºÍÆäËûGCDÏà¹ØµÄ·½·¨£¬ÎÒÃDz»Óõ£ÐÄûÓб»ÀàʵÀýÇ¿ÒýÓõľֲ¿±Õ°üºÍ¿é£¬ËüÃDz»»á·¢ÉúRetain Cycle¡£

´úÀí·½°¸

´úÀí£¨delegation£©ÊÇʹÓÃÈõÒýÓñÜÃâRetain CycleµÄÒ»¸öµäÐͳ¡¾°¡£½«Î¯ÍÐÉùÃ÷ΪweakÒ»Ö±ÊÇÒ»ÖÖ²»´íµÄ×ö·¨£¨²¢ÇÒ»¹Ë㰲ȫ£©¡£ÔÚObjective-CÖУº

@property (nonatomic, weak) id <MyCustomDelegate> delegate;  

SwiftÖУº

weak var delegate: MyCustomDelegate?  

ÔÚ´ó¶àÊýÇé¿öÏ£¬¶ÔÏóµÄ´úÀíʵÀý»¯Á˸öÔÏ󣬻òÕß±»ÈÏΪ±È¶ÔÏó´æÔÚµÄʱ¼ä¸ü³¤¾Ã£¨²¢ÇÒ¶Ô´úÀí·½·¨×ö³ö·´Ó¦£©¡£Òò´Ë£¬ÔÚÒ»¸öÉè¼ÆµÃºÜºÃµÄÀàÖУ¬ÎÒÃDz»»áÕÒµ½Óë¶ÔÏóÉùÃ÷ÖÜÆÚÏà¹ØµÄÈκÎÎÊÌâ¡£

ʹÓÃInstrumentsÀ´µ÷ÊÔRetain Cycle

²»¹ÜÎÒÈçºÎŬÁ¦±ÜÃâRetain Cycle£¬Íü¼ÇÈ¥ÒýÈëÒ»¸öÈõÒýÓò¢ÒâÍâµØ´´½¨Ò»¸ö£¨¶àлARC£¡£©ÕâÑùµÄÊÂÇé³ÙÔ绹Óз¢Éú¡£ÐÒÔ˵ÄÊÇXCodeÌ×¼þÖеÄInstrumentsÓ¦ÓóÌÐòÊǺܲ»´íµÄ¹¤¾ß£¬ÓÃÓÚ¼ì²âºÍ¶¨Î»Retain Cycle¡£Ò»µ©¿ª·¢½×¶Î½áÊø£¬ÔÚÌύƻ¹ûÉ̵ê֮ǰ¾Í·ÖÎö£¨profile£©ÄãµÄÓ¦ÓÃÊǸö²»´íµÄϰ¹ß¡£InstrumentsÓкܶàÄ£°æÓÃÀ´·ÖÎöÓ¦ÓõIJ»Í¬·½Ã棬µ«ÎÒÃǸÐÐËȤµÄÊÇ¡°Leaks¡±Ñ¡Ïî¡£

Ò»µ©´ò¿ªInstruments£¬Äã¾ÍÓ¦¸ÃÆô¶¯Ó¦ÓóÌÐò²¢×÷һЩ½»»¥²Ù×÷£¬ÌرðÊÇÔÚÒª²âÊÔµÄÇøÓò»òÊÔͼ¿ØÖÆÆ÷ÉÏ¡£Èκμì²âµ½µÄй©¶¼½«»áÔÚ¡°Leaks¡±²¿·Ö³öÏÖÒ»ÌõºìÏß¡£¸¨ÖúÊÓͼ°üº¬Ò»¸öÇøÓò£¬InstrumentsÓÃÀ´ÏÔʾ·¢Éúй©´¦µÄ¶ÑÕ»×·×Ù£¬ÓÃÀ´ÕÒµ½ÎÊÌâËùÔÚ£¬ÉõÖÁʹÄã¿ÉÒÔÖ±½Ó¶¨Î»µ½Ôì³ÉÎÊÌâµÄ´úÂë¡£

   
2993 ´Îä¯ÀÀ       37
 
Ïà¹ØÎÄÕÂ

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

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

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]

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


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


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