Objective-C¶ÔÏóÖ®Àà¶ÔÏóºÍÔªÀà¶ÔÏó£¨Ò»£©
×÷ΪCÓïÑԵij¬¼¯£¬ÃæÏò¶ÔÏó³ÉΪObjective-CÓëCÓïÑÔµÄ×î´óÇø±ð£¬Òò´Ë£¬¶ÔÏóÊÇObjective-CÖÐ×îÖØÒªµÄ²¿·ÖÖ®Ò»¡£Ä¿Ç°ÃæÏò¶ÔÏóµÄÓïÑÔÓкܶ࣬Objective-CÖеĶÔÏóÓÖºÍÆäËûÓïÑÔÖеĶÔÏóÓÐÊ²Ã´Çø±ðÄØ£¿ÏÂÃæÀ´¼òµ¥½éÉÜObjective-CÖжÔÏóµÄʵÏÖ¡£
1¡¢Objective-CÖеÄÀà
˶¼ÖªµÀ£¬ËùÓеĶÔÏó¶¼ÊÇÓÉÆä¶ÔÓ¦µÄÀàʵÀý»¯¶øÀ´£¬Êâ²»ÖªÀà±¾ÉíÒ²ÊÇÒ»ÖÖ¶ÔÏó£¬ÏȲ»Òª¶ÔÕâ¾ä»°¸Ðµ½¾ªÑÈ¡£
Ê×ÏÈÎÒÃÇÀ´¹Ø×¢Objective-CÖеÄÀà¡£ÔÚObjective-CÖУ¬ÎÒÃÇÓõ½µÄ¼¸ºõËùÓÐÀà¶¼ÊÇNSObjectÀàµÄ×ÓÀ࣬NSObjectÀඨÒå¸ñʽÈçÏ£¨ºöÂÔÆä·½·¨ÉùÃ÷£©£º
@interface NSObject <NSObject> { Class isa; } |
Õâ¸öClassΪºÎÎÔÚobjc.hÖÐÎÒÃÇ·¢ÏÖÆä½ö½öÊÇÒ»¸ö½á¹¹(struct)Ö¸ÕëµÄtypedef¶¨Òå:
typedef struct objc_class *Class; |
ͬÑùµÄ£¬objc_classÓÖÊÇÊ²Ã´ÄØ£¿ÔÚObjective-C2.0ÖУ¬objc_classµÄ¶¨ÒåÈçÏ£º
struct objc_class { Class isa; } |
дµ½ÕâÀï´ó¼Ò¿ÉÄܾÍÔÎÁË£¬ÔõôÓÖÓÐÒ»¸öisa£¿£¿ÕâЩisaµ½µ×ÊÇʲô£¿Ö®¼äÓÐÊ²Ã´Çø±ðºÍÁªÏµ£¿½ÓÏÂÀ´½â´ðÕâÒ»Á¬´®µÄÒÉÎÊ¡£
ÆäʵÔÚObjective-CÖÐÈκεÄÀඨÒå¶¼ÊǶÔÏó¡£¼´ÔÚ³ÌÐòÆô¶¯µÄʱºòÈκÎÀඨÒå¶¼¶ÔÓ¦ÓÚÒ»¿éÄÚ´æ¡£ÔÚ±àÒëµÄʱºò£¬±àÒëÆ÷»á¸øÃ¿Ò»¸öÀàÉú³ÉÒ»¸öÇÒÖ»Éú³ÉÒ»¸ö¡±ÃèÊöÆä¶¨ÒåµÄ¶ÔÏó¡±,Ò²¾ÍÊÇÆ»¹û¹«Ë¾ËµµÄÀà¶ÔÏó(class
object),ËûÊÇÒ»¸öµ¥Àý(singleton), ¶øÎÒÃÇÔÚC++µÈÓïÑÔÖÐËùνµÄ¶ÔÏ󣬽Ð×öʵÀý¶ÔÏó(instance
object)¡£¶ÔÓÚʵÀý¶ÔÏóÎÒÃDz»ÄÑÀí½â£¬µ«Àà¶ÔÏó(class object)ÊǸÉʲô³ÔµÄÄØ£¿ÎÒÃÇÖªµÀObjective-CÊÇÃźܶ¯Ì¬µÄÓïÑÔ£¬Òò´Ë³ÌÐòÀïµÄËùÓÐʵÀý¶ÔÏó(instace
object)¶¼ÊÇÔÚÔËÐÐʱÓÉObjective-CµÄÔËÐÐʱ¿âÉú³ÉµÄ£¬¶øÕâ¸öÀà¶ÔÏó(class object)¾ÍÊÇÔËÐÐʱ¿âÓÃÀ´´´½¨ÊµÀý¶ÔÏó(instance
object)µÄÒÀ¾Ý¡£
Ôٻص½Ö®Ç°µÄÎÊÌ⣬Ö×ôÕâ¸öʵÀý¶ÔÏó(instance object)µÄisaÖ¸ÕëÖ¸ÏòµÄÀà¶ÔÏó(class
object)ÀïÃæ»¹ÓÐÒ»¸öisaÄØ£¿Õâ¸öÀà¶ÔÏó(class objec)µÄisaÖ¸ÏòµÄÒÀÈ»ÊÇÒ»¸öobjc-class£¬Ëü¾ÍÊÇ¡°ÔªÀà¶ÔÏó¡±(metaclass
object)£¬ËüºÍÀà¶ÔÏó(class object)µÄ¹ØÏµÊÇÕâÑùµÄ:
2¡¢Àà¶ÔÏó£¨class object£©
¢ÙÀà¶ÔÏóµÄʵÖÊ
ÎÒÃÇÖªµÀÁË£ºÀà¶ÔÏóÊÇÓɱàÒëÆ÷´´½¨µÄ£¬¼´ÔÚ±àÒëʱËùνµÄÀ࣬¾ÍÊÇÖ¸Àà¶ÔÏ󣨹ٷ½ÎĵµÖÐÊÇÕâÑù˵µÄ£º
The class object is the compiled version of the class£©¡£ÈκÎÖ±½Ó»ò¼ä½Ó¼Ì³ÐÁËNSObjectµÄÀ࣬ËüµÄʵÀý¶ÔÏó(instance
objec)Öж¼ÓÐÒ»¸öisaÖ¸Õ룬ָÏòËüµÄÀà¶ÔÏó(class object)¡£Õâ¸öÀà¶ÔÏó(class object)Öд洢Á˹ØÓÚÕâ¸öʵÀý¶ÔÏó(instace
object)ËùÊôµÄÀàµÄ¶¨ÒåµÄÒ»ÇУº°üÀ¨±äÁ¿£¬·½·¨£¬×ñÊØµÄÐÒéµÈµÈ¡£Òò´Ë£¬Àà¶ÔÏóÄÜ·ÃÎÊËùÓйØÓÚÕâ¸öÀàµÄÐÅÏ¢£¬ÀûÓÃÕâЩÐÅÏ¢¿ÉÒÔ²úÉúÒ»¸öеÄʵÀý£¬µ«ÊÇÀà¶ÔÏó²»ÄÜ·ÃÎÊÈκÎʵÀý¶ÔÏóµÄÄÚÈÝ¡£
µ±Äãµ÷ÓÃÒ»¸ö ¡°Àà·½·¨¡± ÀýÈç [NSObject alloc],ÄãÊÂʵÉÏÊÇ·¢ËÍÁËÒ»¸öÏûÏ¢¸øËûµÄÀà¶ÔÏó¡£
¢ÚÀà¶ÔÏóºÍʵÀý¶ÔÏóµÄÇø±ð
µ±È»ÓÐÇø±ðÁË£¬¾¡¹ÜÀà¶ÔÏó±£ÁôÁËÒ»¸öÀàʵÀýµÄÔÐÍ£¬µ«Ëü²¢²»ÊÇʵÀý±¾Éí¡£ËüûÓÐ×Ô¼ºµÄʵÀý±äÁ¿£¬Ò²²»ÄÜÖ´ÐÐÄÇЩÀàµÄʵÀýµÄ·½·¨£¨Ö»ÓÐʵÀý¶ÔÏó²Å¿ÉÒÔÖ´ÐÐʵÀý·½·¨£©¡£È»¶ø£¬ÀàµÄ¶¨ÒåÄܰüº¬ÄÇÐ©ÌØÒâΪÀà¶ÔÏó×¼±¸µÄ·½·¨¨CÀà·½·¨£¨
¶ø²»ÊǵÄʵÀý·½·¨£©¡£Àà¶ÔÏó´Ó¸¸ÀàÄÇÀï¼Ì³ÐÀà·½·¨£¬¾ÍÏñʵÀý´Ó¸¸ÀàÄÇÀï¼Ì³ÐʵÀý·½·¨Ò»Ñù¡£
¢ÛÀà¶ÔÏóÓëÀàÃû
ÔÚÔ´´úÂëÖУ¬Àà¶ÔÏóÓÉÀàÃû±íʾ¡£
ÔÚÏÂÃæµÄÀý×ÓÖУ¬RetangleÀà ÓôÓNSObjectÄÇÀï¼Ì³ÐÀ´µÄ·½·¨À´·µ»ØÀàµÄ°æ±¾ºÅ£º
int versionNumber = [Rectangle version]; |
Ö»ÓÐÔÚÏûÏ¢±í´ïʽÖÐ×÷Ϊ½ÓÊÕÕߣ¬ÀàÃû²Å´ú±íÀà¶ÔÏ󡣯äËûµØ·½£¬ÄãÐèÒªÒªÇóÒ»¸öʵÀý»òÕßÀà·µ»Øclass
id¡£ ÏìÓ¦classÏûÏ¢£º
id aClass = [anObject class]; id rectClass = [Rectangle class]; |
ÈçͬÉÏÃæµÄÀý×ÓÏÔʾµÄÄÇÑù£¬Àà¶ÔÏóÏñÆäËû¶ÔÏóÒ»Ñù£¬Ò²ÊÇidÀàÐÍ¡£
×ÜÖ®£¬Àà¶ÔÏóÊÇÒ»¸ö¹¦ÄÜÍêÕûµÄ¶ÔÏó£¬ËùÒÔÒ²Äܱ»¶¯Ì¬Ê¶±ð£¨dynamically typed£©£¬½ÓÊÕÏûÏ¢£¬´ÓÆäËûÀà¼Ì³Ð·½·¨¡£ÌØÊâÖ®´¦ÔÚÓÚËüÃÇÊÇÓɱàÒëÆ÷´´½¨µÄ£¬È±ÉÙËüÃÇ×Ô¼ºµÄÊý¾Ý½á¹¹(ʵÀý±äÁ¿£©£¬Ö»ÊÇÔÚÔËÐÐʱ²úÉúʵÀýµÄ´úÀí¡£
3¡¢ÔªÀà¶ÔÏó(metaclass object)
ÔªÀà¶ÔÏóµÄʵÖÊ
ʵ¼ÊÉÏ£¬Àà¶ÔÏóÊÇÔªÀà¶ÔÏóµÄÒ»¸öʵÀý£¡£¡ÔªÀàÃèÊöÁË Ò»¸öÀà¶ÔÏ󣬾ÍÏñÀà¶ÔÏóÃèÊöÁËÆÕͨ¶ÔÏóÒ»Ñù¡£²»Í¬µÄÊÇÔªÀàµÄ·½·¨ÁбíÊÇÀà·½·¨µÄ¼¯ºÏ£¬ÓÉÀà¶ÔÏóµÄÑ¡ÔñÆ÷À´ÏìÓ¦¡£µ±ÏòÒ»¸öÀà·¢ËÍÏûϢʱ£¬objc_msgSend»áͨ¹ýÀà¶ÔÏóµÄisaÖ¸Õ붨λµ½ÔªÀ࣬²¢¼ì²éÔªÀàµÄ·½·¨ÁÐ±í£¨°üÀ¨¸¸ÀࣩÀ´¾ö¶¨µ÷ÓÃÄĸö·½·¨¡£ÔªÀà´úÌæÁËÀà¶ÔÏóÃèÊöÁËÀà·½·¨£¬¾ÍÏñÀà¶ÔÏó´úÌæÁËʵÀý¶ÔÏóÃèÊöÁËʵÀý»¯·½·¨¡£
ºÜÏÔÈ»£¬ÔªÀàÒ²ÊǶÔÏó£¬Ò²Ó¦¸ÃÊÇÆäËûÀàµÄʵÀý£¬Êµ¼ÊÉÏÔªÀàÊǸùÔªÀà(root
class¡¯s metaclass)µÄʵÀý,¶ø¸ùÔªÀàÊÇÆä×ÔÉíµÄʵÀý£¬¼´¸ùÔªÀàµÄisaÖ¸ÕëÖ¸Ïò×ÔÉí¡£
ÀàµÄsuper_classÖ¸ÏòÆä¸¸À࣬¶øÔªÀàµÄsuper_classÔòÖ¸Ïò¸¸ÀàµÄÔªÀà¡£ÔªÀàµÄsuper
classÁ´ÓëÀàµÄsuper classÁ´Æ½ÐУ¬ËùÒÔÀà·½·¨µÄ¼Ì³ÐÓëʵÀý·½·¨µÄ¼Ì³ÐÒ²ÊDz¢Ðеġ£¶ø¸ùÔªÀà(root
class¡¯s metaclass)µÄsuper_classÖ¸Ïò¸ùÀà(root class)£¬ÕâÑù£¬Õû¸öÖ¸ÕëÁ´¾ÍÁ´½ÓÆðÀ´ÁË£¡£¡
¼Çס£¬µ±Ò»¸öÏûÏ¢·¢Ë͸øÈκÎÒ»¸ö¶ÔÏó£¬ ·½·¨µÄ¼ì²é ´Ó¶ÔÏóµÄ isa Ö¸Õ뿪ʼ£¬È»ºóÊǸ¸ÀࡣʵÀý·½·¨ÔÚÀàÖж¨Ò壬
Àà·½·¨ ÔÚÔªÀàºÍ¸ùÀàÖж¨Òå¡££¨¸ùÀàµÄÔªÀà¾ÍÊǸùÀà×Ô¼º£©¡£ÔÚһЩ¼ÆËã»úÓïÑÔµÄÔÀíÖУ¬Ò»¸öÀàºÍÔªÀà²ã´Î½á¹¹¿ÉÒÔ¸ü×ÔÓɵÄ×é³É£¬¸üÉîÔªÀàÁ´ºÍ´Óµ¥Ò»µÄÔªÀà¼Ì³ÐµÄ¸ü¶àµÄʵÀý»¯µÄÀà¡£Objective-C
µÄÀà·½·¨ ÊÇʹÓÃÔªÀàµÄ¸ù±¾ÔÒò£¬ÔÚÆäËû·½ÃæÊÔͼÔÚÒþ²ØÔªÀà¡£ÀýÈç [NSObject class] ÍêÈ«ÏàµÈÓÚ
[NSObject self]£¬ËùÒÔ£¬ÔÚÐÎʽÉÏËû»¹ÊÇ·µ»ØµÄ NSObject->isa Ö¸ÏòµÄÔªÀà¡£
Objective-CÓïÑÔÊÇÒ»×éʵÓõÄÕÛÖз½°¸¡£
»¹ÓÐЩ²»Ã÷°×£¿ ÏÂÃæÕâ¸öͼ±ê¿ÉÄÜ»áÓÐЩ°ïÖú£º

×ÛÉÏËùÊö£¬Àà¶ÔÏó(class object)Öаüº¬ÁËÀàµÄʵÀý±äÁ¿£¬ÊµÀý·½·¨µÄ¶¨Ò壬¶øÔªÀà¶ÔÏó(metaclass
object)ÖаüÀ¨ÁËÀàµÄÀà·½·¨(Ò²¾ÍÊÇC++Öеľ²Ì¬·½·¨)µÄ¶¨Òå¡£Àà¶ÔÏóºÍÔªÀà¶ÔÏóÖе±È»»¹»á°üº¬Ò»Ð©ÆäËüµÄ¶«Î÷£¬Æ»¹ûÒÔºóÒ²¿ÉÄÜÌí¼ÓÆäËüµÄÄÚÈÝ£¬µ«¶ÔÓÚÎÒÃÇÖ»ÐèÒª¼Çס£ºÀà¶ÔÏó´æµÄÊǹØÓÚʵÀý¶ÔÏóµÄÐÅÏ¢(±äÁ¿£¬ÊµÀý·½·¨µÈ)£¬¶øÔªÀà¶ÔÏó(metaclass
object)Öд洢µÄÊǹØÓÚÀàµÄÐÅÏ¢(ÀàµÄ°æ±¾£¬Ãû×Ö£¬Àà·½·¨µÈ)¡£Òª×¢ÒâµÄÊÇ£¬Àà¶ÔÏó(class object)ºÍÔªÀà¶ÔÏó(metaclass
object)µÄ¶¨Òå¶¼ÊÇobjc_class½á¹¹£¬Æä²»Í¬½ö½öÊÇÔÚÓÃ;ÉÏ£¬±ÈÈçÆäÖеķ½·¨ÁбíÔÚÀà¶ÔÏó(instance
object)Öб£´æµÄÊÇʵÀý·½·¨(instance method)£¬¶øÔÚÔªÀà¶ÔÏó(metaclass object)ÖÐÔò±£´æµÄÊÇÀà·½·¨(class
method)¡£¹ØÓÚÔªÀà¶ÔÏó¿ÉÒԲο¼Æ»¹û¹Ù·½Îĵµ" The Objective-©\C Programming
Language "
4¡¢Àà¶ÔÏóºÍÔªÀà¶ÔÏóµÄÏà¹Ø·½·¨
¢Ùobject_getClass¸úËæÊµÀýµÄisaÖ¸Õ룬·µ»Ø´ËʵÀýËùÊôµÄÀ࣬¶ÔÓÚʵÀý¶ÔÏó(instance)·µ»ØµÄÊÇÀà(class),¶ÔÓÚÀà(class)Ôò·µ»ØµÄÊÇÔªÀà(metaclass),
¢Ú-class·½·¨¶ÔÓÚʵÀý¶ÔÏó(instance)»á·µ»ØÀà(class),µ«¶ÔÓÚÀà(class)Ôò²»»á·µ»ØÔªÀà(metaclass),¶øÖ»»á·µ»ØÀà±¾Éí£¬¼´[@"instance"
class]·µ»ØµÄÊÇ__NSCFConstantString,¶ø[NSString class]·µ»ØµÄÊÇNSString¡£
¢Ûclass_isMetaClass¿ÉÅжÏijÀàÊÇ·ñΪԪÀà.
¢ÜʹÓÃobjc_allocateClassPair¿ÉÔÚÔËÐÐʱ´´½¨ÐµÄÀàÓëÔªÀà¶Ô£¬Ê¹ÓÃclass_addMethodºÍclass_addIvar¿ÉÏòÀàÖÐÔö¼Ó·½·¨ºÍʵÀý±äÁ¿£¬×îºóʹÓÃobjc_registerClassPair×¢²áºó£¬¾Í¿ÉÒÔʹÓôËÀàÁË¡£¿´µ½¶¯Ì¬ÓïÑÔÅ£±ÆµÄµØ·½ÁËÂ𣬿ÉÒÔÔÚÐèҪʱ¸ü¸ÄÒѾ¶¨ÒåºÃµÄÀ࣡Objective-CµÄÀà±ð·½·¨¹À¼Æµ×²ã¾ÍÊÇÕâôʵÏֵģ¬Ö»ÊDz»ÖªµÀΪʲôÀà±ð²»ÄÜÔö¼ÓʵÀý±äÁ¿£¬ÓиßÊÖÇëÁôÑÔ¡£
Objective-C¶ÔÏóÖ®³õʼ»¯ºÍÁ½¶Î¹¹Ôì·¨£¨¶þ£©
Objective-CΪÎÒÃÇÌṩÁËÁ½ÖÖ³õʼ»¯¶ÔÏóµÄ·½·¨£ºObjective-C2.0ÒÔºó¿ÉÓõÄnew·½·¨ºÍÁ½¶Î¹¹Ôì·¨¡£¼ÈȻҪ±È½ÏÕâÁ½ÖÖ³õʼ»¯·½·¨£¬¾Í´ÓËüÃDZ¾ÉíµÄÒìͬ³ö·¢°É¡£
Ò»¡¢Á½¶Î¹¹Ôì·¨
ÕâÊÇObjective-CÌØÓеĶÔÏó´´½¨·½·¨£¬ÊéдÐÎʽÈçÏ£º
NSString*s=[[NSString alloc] init]; |
ËùνµÄÁ½¶Î¹¹Ô죬¾ÍÊÇÖ¸½«allocºÍinit·Ö¿ªÀ´Ð´£¬ÕâºÍ´ó¶àÊýÆäËüÓïÑÔ£¨ÈçC¡¢C++¡¢Java¡¢JavaScript£©¶¼²»Ò»Ñù¡£ÏÈÀ´¿´¿´allocºÍinit¶¼¸ÉÁËʲô°É£º
1¡¢alloc·½·¨
µ±¶ÔÏó´´½¨Ê±£¬cocoa»á´ÓÓ¦ÓóÌÐòµÄÐéÄâµØÖ·¿Õ¼äÉÏΪ¸Ã¶ÔÏó·ÖÅä×ã¹»µÄÄÚ´æ¡£cocoa»á±éÀú¸Ã¶ÔÏóËùÓеijÉÔ±±äÁ¿£¬Í¨¹ý³ÉÔ±±äÁ¿µÄÀàÐÍÀ´¼ÆËãËùÐèÕ¼ÓõÄÄÚ´æ¡£
µ±ÎÒÃÇͨ¹ýalloc»òallocWithZone·½·¨´´½¨¶ÔÏóʱ£¬cocoa»á·µ»ØÒ»¸öδ¡±³õʹ»¯¡°¹ýµÄ¶ÔÏó¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬cocoa³ýÁËÉÏÃæÌáµ½µÄÉêÇëÁËÒ»¿é×ã¹»´óµÄÄÚ´æÍ⣬»¹×öÁËÒÔÏÂ3¼þÊ£º
¢Ù½«¸ÃжÔÏóµÄÒýÓüÆÊý(Retain Count)ÉèÖóÉ1¡£
¢Ú½«¸ÃжÔÏóµÄisa³ÉÔ±±äÁ¿Ö¸ÏòËüµÄÀà¶ÔÏó¡£isa³ÉÔ±±äÁ¿Ö¸Ïò·ÖÅäÄÚ´æµÄÀà¶ÔÏó£¨class
object£©£¬ÕâÊÇÔÚNSObjectÀàÖж¨ÒåµÄ£¬ËùÒÔ±£Ö¤CocoaµÄËùÓжÔÏó¶¼´øÓд˳ÉÔ±±äÁ¿¡£ËüÓëObjective-CµÄÔËÐÐʱÊÇÒ»ÌåµÄ£¬½èÖú¸Ã±äÁ¿¿ÉÒÔʵÏÖCocoa¶ÔÏóÔÚÔËÐÐʱµÄ×ÔÊ¡(Introspection)¹¦ÄÜ¡£
¢Û½«¸ÃжÔÏóµÄËùÓÐÆäËü³ÉÔ±±äÁ¿µÄÖµÉèÖóÉÁã¡££¨¸ù¾Ý³ÉÔ±±äÁ¿ÀàÐ͵IJ»Í¬£¬ÁãÓпÉÄÜÊÇÖ¸nil»ò0£©
¢Ü·µ»ØÖ¸Ïò¸Ã¶ÔÏóµÄÒ»¸öÖ¸Õë¡£
2¡¢init·½·¨
´ó²¿·ÖÇé¿öÏ£¬ÎÒÃǶ¼²»Ï£ÍûËùÓгÉÔ±±äÁ¿¶¼ÊÇÁ㣬ËùÒÔ
¢Ùinit·½·¨»á×öÕæÕýµÄ³õʹ»¯¹¤×÷£¬ÈöÔÏóµÄ³ÉÔ±±äÁ¿µÄÖµ·ûºÏÎÒÃdzÌÐòÂß¼Öеijõʼ»¯×´Ì¬¡£ÀýÈ磬NSMutableString¿ÉÄܾͻá¶îÍâÔÙÉêÇëÒ»¿é×Ö·ûÊý×飬ÓÃÓÚ¶¯Ì¬ÐÞ¸Ä×Ö·û´®¡£
¢Ú·µ»ØÕæÕý¿ÉÒÔʹÓõÄÖ¸Ïò¸Ã¶ÔÏóµÄÖ¸Õë
init»¹ÓÐÒ»¸öÐèҪעÒâµÄÎÊÌ⣬ijЩÇé¿öÏ£¬init»áÔì³ÉallocµÄÔ±¾¿Õ¼ä²»¹»Ó㬶ø½øÐеڶþ´Î·ÖÅäÄÚ´æ¿Õ¼ä¡£ËùÒÔÏÂÃæµÄд·¨ÊÇ´íµÄ£º
NSString *s=[NSString alloc]; |
[s init];// Õâ¶ùinit·µ»ØµÄµØÖ·¿ÉÄÜ»á±ä¡£sÔ±¾µÄÖ¸ÕëµØÖ·¿ÉÄÜÊÇÎÞЧµÄµØÖ·¡£
Ϊ´Ë£¬Æ»¹ûÒýÈëÁËÒ»¸ö±à³Ì¹æ·¶£¬Èôó¼ÒдµÄʱºò½«alloc ºÍinitдÔÚÒ»ÐС£ËùÒÔÉÏÃæµÄ´úÂëÕýÈ·µÄд·¨ÊÇ
NSString *s=[[NSString alloc] init]; |
¶þ¡¢new·½·¨
¿ÉÄÜÊÇΪÁËºÍÆäËûÓïÑÔ±£³ÖÒ»Ö£¬Æ»¹ûºóÀ´Ò²ÍƳöÁËnew·½·¨À´³õʼ»¯¶ÔÏó¡£×÷ΪÀà·½·¨µÄnew£¬Ö»ÊǼòµ¥µØµÈ¼ÛÓÚ
alloc + init£¬È´²»ÄÜÖ¸¶¨initµÄ²ÎÊý£¬ËùÒÔʵ¼ÊʹÓÃÖкÜÉÙ¼ûµ½¡£
Èý¡¢Ê¹ÓÃÁ½¶Î¹¹Ôì·¨µÄÔÒò
ÓÐÈË¿ÉÄÜÒªÎÊ£¬Objective-CµÄ¶ÔÏó´´½¨·½·¨ºÍ´ó¶àÊýÆäËüÓïÑÔ£¨ÈçC¡¢C++¡¢Java¡¢JavaScript£©¶¼²»Ò»Ñù£¬ÊÇʲôÔÒò´ÙʹObjective-C×öÁËÕâÖÖÉè¼Æ£¿
1¡¢ÀúÊ·ÔÒò
ÕâÀïÃæ¶à¶àÉÙÉÙ¾ÍÓÐÀúÊ·µÄÒòËØÁË¡£Objective-CÊÇÒ»Ãŷdz£ÀϵÄÓïÑÔ¡£Èç¹ûÄã²éÔÄÎĵµ£¬Äã»á·¢ÏÖËüºÍC++³öÉúÔÚͬһʱ´ú£¨Á½ÖÖÓïÑԵķ¢ÐÐÄê·Ý¶¼ÊÇ1983Ä꣩£¬¶¼ÊÇ×÷ΪCÓïÑÔµÄÃæÏò¶ÔÏóµÄ½Ó°àÈ˱»ÍƳö¡£µ±È»£¬×îÖÕC++ʤ³ö¡£ÓÉÓÚÀúÊ·¾ÃÔ¶£¬Objective-CÒ²ÎÞ·¨ÓÐÌ«¶àÓÅÐãµÄÓïÑÔ×ö²Î¿¼£¬ËùÒÔ£¬ÓкܶàÀúÊ·ÒÅÁôµÄÉè¼Æ¡£
2¡¢Éè¼ÆÔÔò
¼òµ¥¿´À´£¬¸ù¾ÝÉè¼ÆÄ£Ê½µÄSingle ResponsibilityµÄÉè¼ÆÔÔò£¬Æ»¹û¾õµÃallocºÍinitÊÇ×öµÄ2¼þ²»Í¬µÄÊÂÇ飬°ÑÕâÁ½¼þÊÂÇé·Ö¿ª·ÅÔÚ2¸öº¯ÊýÖУ¬¶ÔÓÚ³ÌÐòÔ±¸ü¼ÓÇå³þÃ÷ÁË¡£¸üÏêϸ²éÔÄÎĵµºó£¬ÎÒ¾õµÃÕâÊÇÓÉÓÚÀúÊ·ÔÒò£¬ÈÃÆ»¹û¾õµÃalloc·½·¨¹ýÓÚ¸´ÔÓ£¬ÔÚÀúÊ·ÉÏ£¬alloc²»½ö½öÊÇ·ÖÅäÄڴ棬»¹¿ÉÒÔÏêϸµÄÖ¸¶¨¸ÃÄÚ´æËùÔÚµÄÄÚ´æ·ÖÇø£¨ÓÃNSZone±íʾ£©¡£
ͬʱÓÉÓÚ·ÖÅäºÍ³õʼ»¯½×¶ÎÊÇ·Ö¿ªµÄ£¬³õʼ»¯·½·¨µÄʵÏÖÖ»Ðè´¦ÀíÐÂʵÀýµÄ±äÁ¿£¬²¢ÍêÈ«ºöÂÔÓйطÖÅäµÄÎÊÌ⣬¼ò»¯Á˳õʼ»¯·½·¨µÄ¹ý³Ì¡£
ËÄ¡¢NSZone¼ò½é
ÔçÆÚÆ»¹ûÊǽ¨Òé³ÌÐòԱʹÓà allocWithZoneÀ´¹ÜÀíÄÚ´æ·ÖÅäµÄ£¬Ã¿¸öNSZone±íʾһ¿éÄÚ´æ·ÖÇø£¬+allocWithZone£º(NSZone
*)zone·½·¨¿ÉÒÔÔÊÐí¶ÔÏó´ÓÖ¸¶¨·ÖÇø·ÖÅäÄÚ´æ¡£ÄÚ´æÇøÊÇCocoaµÄÒ»¸ö¹¦Äܲ¿¼þ£¬ËüÄÜʹͬʱʹÓõĶÔÏó»ò¼ÆËã»úµÄµØÖ·¿Õ¼äÖÐÏàÁڵĶÔÏó±£³ÖÔÚÄÚ´æÖУ¬ÒÔ´ËÌá¸ß³ÌÐòµÄÐÔÄÜ¡£Òª½âÊͶÔÏóÔÚÄÚ´æÖеÄλÖûáÈçºÎÓ°ÏìÐÔÄÜ£¬ÐèÒª½âÊÍÓ¦ÓóÌÐòÐèÒª±ÈÎïÀíÄÚ´æ¸ü´óµÄÄÚ´æÊ±»á·¢ÉúʲôÇé¿ö¡£
ÿ¸öCocoaÓ¦ÓóÌÐò¶¼ÓкܴóµÄ¿ÉѰַÄڴ棬µ±Ó¦ÓóÌÐò¶¯Ì¬µÄ·ÖÅäÄÚ´æÊ±£¬¼´Ê¹¼ÆËã»úµÄËùÓÐÎïÀíÄÚ´æ¶¼ÒѾ±»Õ¼Ó㬲Ù×÷ϵͳÈÔÈ»»áÌṩÄÚ´æ¡£ÒªÂú×ã¸Ã·ÖÅäÒªÇ󣬲Ù×÷ϵͳ»áʹÓÃÒ³Ãæµ÷¶È£¨paging£©»òÕß½»»»£¨swapping£©²Ù×÷½«Ò»Ð©ÎïÀíÄÚ´æÖеÄÄÚÈݸ´ÖƵ½Ó²ÅÌ£¬Ö®Ç°ÕýÔÚʹÓõÄÎïÀíÄÚ´æ¾Í¿ÉÒÔ±»Ìṩ³öÀ´Ê¹ÓÃÁË£¬¶øÖ®Ç°µÄÄÇЩÊý¾ÝÓ¦¾±»Ð´ÈëÓ²ÅÌ¡£Èç¹ûÓÐÐèÒªÏÈǰ¸´ÖƵ½Ó²Å̵ÄÄDz¿·ÖÄÚ´æÊý¾Ý£¬²Ù×÷ϵͳ»á½«ÁíÍâÒ»¿éÎïÀíÄÚ´æ¸´ÖÆµ½Ó²ÅÌ£¬²¢½«ÏÈǰµÄ¾ÉÄÚ´æÔٶȵ÷»ØÄÚ´æ¡£¼´Ê±ÄÚ´æÔÚÓ²Å̼äµ÷¶È£¬²Ù×÷ϵͳÈÔÈ»ÄÜΪÿ¸öÓ¦ÓóÌÐòÓ³É䵨ַ¿Õ¼äµ½ÎïÀíÄÚ´æ¡£²Ù×÷ϵͳµÄÕâÒ»¹¦Äܼ´ÊÇÐéÄâÄڴ棨virtual
memory£©¡£
ÓÉÓÚ´ÓÎïÀíÄÚ´æ¶îÓ²ÅÌÖÐÏ໥µ÷¶ÈÊǺÜÏûºÄʱ¼äµÄ£¬Òò´Ë£¬Ê¹ÓÃÐéÄâÄÚ´æ»áÓ°ÏìÐÔÄÜ¡£¹ý¶àµÄÒ³Ãæµ÷¶È»á½µµÍϵͳÐÔÄÜ£¬Õâ³ÆÎª¶¶¶¯£¨thrashing£©¡£Èç¹ûÒ»ÆðʹÓõÄÁ½¸ö»ò¶à¸ö¶ÔÏóÔÚÄÚ´æÖеÄλÖúÜÔ¶£¬¶¶¶¯·¢ÉúµÄ¿ÉÄÜÐÔ½«»á´ó´óÔö¼Ó£¬Òò´Ë¶ÔÏóʵÀýµÄÄÚ´æ·ÖÅäµÄλÖÃÒ²ºÜÖØÒª¡£
·ÖÇøÓÃÓÚÈ·±£·ÖÅä¸øÍ¬Ê±Ê¹ÓõĶÔÏóµÄÄÚ´æÎ»ÓÚÏàÁÚλÖᣵ±ÐèҪij¸ö¶ÔÏóʱ£¬ÁíÍâÏàÁڵĶÔÏóÒ²»ù±¾»áÓõ½£¬ÐèÒªµÄËùÓжÔÏóͬʱµ÷ÈëÄÚ´æµÄ¿ÉÄÜÐԾ͸ü´ó£¬µ±²»ÐèҪʱ£¬ÓÖ¿ÉÒÔ¶¼Í¬Ê±µ÷³öÄڴ棬CocoaÖеÄNSZoneÀàÐÍÊÇÖ¸¶¨±êʶÄÚ´æÇøµÄC½á¹¹µÄ¶ÔÏó£¬+allocWithZone£º(NSZone
*)zone·½·¨ÔÊÐíNSZone±äÁ¿´ÓÖ¸¶¨·ÖÇø·ÖÅäÄÚ´æ¡£ÒÑ´ïµ½¼õÉÙ¶¶¶¯µÄÄ¿µÄ¡£¿É¼ûµ±ÄêÆ»¹ûµÄÉè¼ÆÊ¦ÃǵÄÁ¼¿àÓÃÐÄ£¡£¡£¡
Ö»ÊÇ£¬·ÖÇøÊÇÒ»¸öÊ®·Öµ×²ãµÄ¶«Î÷£¬¶øÇÒ£¬Ëæ×ÅÓ²¼þÉ豸µÄ·¢Õ¹£¬ÎïÀíÄÚ´æµÄ²»¶ÏÔö´ó£¬ÒÔ¼°²Ù×÷ϵͳÄÚ´æ·ÖÅ亯Êý¸´ÔÓÐÔµÄÌá¸ß£¬Ê¹Ó÷ÖÇøµÄ×î³õÄ¿µÄÒѾÖð½¥ÏûʧÁË¡£×Ô´ÓMac
OS X 10.5ÉÏÒýÈëÁËÀ¬»ø»ØÊÕ»úÖÆºó£¬Æ»¹û¾Í²»½¨Òé³ÌÐòԱʹÓÃallocWithZoneÁË£¬ÊÂʵÉÏ£¬cocoa¿ò¼ÜÒ²»áºöÂÔ+allocWithZone£º(NSZone
*)zoneÖ¸¶¨µÄ·ÖÇø¡£Æ»¹ûÔÚÎĵµÖÐÒ²Ìáµ½£¬+allocWithZone£º(NSZone *)zone½ö½öÊÇÒ»¸öÀúÊ·ÒÅÁôÉè¼ÆÁË¡£ |