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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Objective-CÖеÄBlock
 
×÷Õߣºspring0924 À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ 2015-01-22
  2662  次浏览      28
 

1.Ïà¹Ø¸ÅÄî

ÔÚÕâÆª±Ê¼Ç¿ªÊ¼Ö®Ç°£¬ÎÒÃÇÐèÒª¶ÔÒÔϸÅÄîÓÐËùÁ˽⡣

1.1 ²Ù×÷ϵͳÖеÄÕ»ºÍ¶Ñ

×¢£ºÕâÀïËù˵µÄ¶ÑºÍÕ»ÓëÊý¾Ý½á¹¹ÖеĶѺÍÕ»²»ÊÇÒ»»ØÊ¡£

ÎÒÃÇÏÈÀ´¿´¿´Ò»¸öÓÉC/C++/OBJC±àÒëµÄ³ÌÐòÕ¼ÓÃÄÚ´æ·Ö²¼µÄ½á¹¹£º

Õ»Çø£¨stack£©£ºÓÉϵͳ×Ô¶¯·ÖÅ䣬һ°ã´æ·Åº¯Êý²ÎÊýÖµ¡¢¾Ö²¿±äÁ¿µÄÖµµÈ¡£ÓɱàÒëÆ÷×Ô¶¯´´½¨ÓëÊÍ·Å¡£Æä²Ù×÷·½Ê½ÀàËÆÓÚÊý¾Ý½á¹¹ÖеÄÕ»£¬¼´ºó½øÏȳö¡¢ÏȽøºó³öµÄÔ­Ôò¡£

ÀýÈ磺ÔÚº¯ÊýÖÐÉêÃ÷Ò»¸ö¾Ö²¿±äÁ¿int b;ϵͳ×Ô¶¯ÔÚÕ»ÖÐΪb¿ª±Ù¿Õ¼ä¡£

¶ÑÇø£¨heap£©£ºÒ»°ãÓɳÌÐòÔ±ÉêÇë²¢Ö¸Ã÷´óС£¬×îÖÕÒ²ÓɳÌÐòÔ±ÊÍ·Å¡£Èç¹û³ÌÐòÔ±²»ÊÍ·Å£¬³ÌÐò½áÊøÊ±¿ÉÄÜ»áÓÉOS»ØÊÕ¡£¶ÔÓÚ¶ÑÇøµÄ¹ÜÀíÊDzÉÓÃÁ´±íʽ¹ÜÀíµÄ£¬²Ù×÷ϵͳÓÐÒ»¸ö¼Ç¼¿ÕÏÐÄÚ´æµØÖ·µÄÁ´±í£¬µ±½ÓÊÕµ½³ÌÐò·ÖÅäÄÚ´æµÄÉêÇëʱ£¬²Ù×÷ϵͳ¾Í»á±éÀú¸ÃÁ´±í£¬±éÀúµ½Ò»¸ö¼Ç¼µÄÄÚ´æµØÖ·´óÓÚÉêÇëÄÚ´æµÄÁ´±í½Úµã£¬²¢½«¸Ã½Úµã´Ó¸ÃÁ´±íÖÐɾ³ý£¬È»ºó½«¸Ã½Úµã¼Ç¼µÄÄÚ´æµØÖ··ÖÅ䏸³ÌÐò¡£

ÀýÈ磺ÔÚCÖÐmallocº¯Êý

 char p1;
 p1 = (char )malloc(10);

µ«ÊÇp1±¾ÉíÊÇÔÚÕ»Öеġ£

Á´±í£ºÊÇÒ»ÖÖ³£¼ûµÄ»ù´¡Êý¾Ý½á¹¹£¬Ò»°ã·ÖΪµ¥ÏòÁ´±í¡¢Ë«ÏòÁ´±í¡¢Ñ­»·Á´±í¡£ÒÔÏÂΪµ¥ÏòÁ´±íµÄ½á¹¹Í¼£º

µ¥ÏòÁ´±íÊÇÁ´±íÖÐ×î¼òµ¥µÄÒ»ÖÖ£¬Ëü°üº¬Á½¸öÇøÓò£¬Ò»¸öÐÅÏ¢ÓòºÍÒ»¸öÖ¸ÕëÓò¡£ÐÅÏ¢Óò±£´æ»òÏÔʾ¹ØÓÚ½ÚµãµÄÐÅÏ¢£¬Ö¸ÕëÓò´¢´æÏÂÒ»¸ö½ÚµãµÄµØÖ·¡£

ÉÏÊöµÄ¿ÕÏÐÄÚ´æµØÖ·Á´±íµÄÐÅÏ¢Óò±£´æµÄ¾ÍÊÇ¿ÕÏÐÄÚ´æµÄµØÖ·¡£

È«¾ÖÇø/¾²Ì¬Çø£º¹ËÃû˼Ò壬ȫ¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿´æ´¢ÔÚÕâ¸öÇøÓò¡£Ö»²»¹ý³õʼ»¯µÄÈ«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿´æ´¢ÔÚÒ»¿é£¬Î´³õʼ»¯µÄÈ«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿´æ´¢ÔÚÒ»¿é¡£³ÌÐò½áÊøºóÓÉϵͳÊÍ·Å¡£

ÎÄ×Ö³£Á¿Çø£ºÕâ¸öÇøÓòÖ÷Òª´æ´¢×Ö·û´®³£Á¿¡£³ÌÐò½áÊøºóÓÉϵͳÊÍ·Å¡£

³ÌÐò´úÂëÇø£ºÕâ¸öÇøÓòÖ÷Òª´æ·Åº¯ÊýÌåµÄ¶þ½øÖÆ´úÂë¡£

ÏÂÃæ¾ÙÒ»¸öǰ±²Ð´µÄÀý×Ó£º

//main.cpp
int a = 0; // È«¾Ö³õʼ»¯Çø
char *p1; // È«¾Öδ³õʼ»¯Çø
main {
int b; // Õ»
char s[] = "abc"; // Õ»
char *p2; // Õ»
char *p3 = "123456"; // 123456\0ÔÚ³£Á¿Çø£¬p3ÔÚÕ»ÉÏ
static int c =0£» // È«¾Ö¾²Ì¬³õʼ»¯Çø
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // ·ÖÅäµÃÀ´µÄ10ºÍ20×Ö½ÚµÄÇøÓò¾ÍÔÚ¶ÑÇø
strcpy(p1, "123456"); // 123456\0ÔÚ³£Á¿Çø£¬Õâ¸öº¯ÊýµÄ×÷ÓÃÊǽ«"123456" Õâ´®×Ö·û´®¸´ÖÆÒ»·Ý·ÅÔÚp1ÉêÇëµÄ10¸ö×ֽڵĶÑÇøÓòÖС£
// p3Ö¸ÏòµÄ"123456"ÓëÕâÀïµÄ"123456"¿ÉÄܻᱻ±àÒëÆ÷ÓÅ»¯³ÉÒ»¸öµØÖ·¡£
}

strcpyº¯Êý

Ô­ÐÍÉùÃ÷£ºextern char *strcpy(char* dest, const char *src);

¹¦ÄÜ£º°Ñ´ÓsrcµØÖ·¿ªÊ¼ÇÒº¬ÓÐNULL½áÊø·ûµÄ×Ö·û´®¸´ÖƵ½ÒÔdest¿ªÊ¼µÄµØÖ·¿Õ¼ä¡£

1.2 ½á¹¹Ì壨Struct£©

ÔÚCÓïÑÔÖУ¬½á¹¹Ìå(struct)Ö¸µÄÊÇÒ»ÖÖÊý¾Ý½á¹¹¡£½á¹¹Ìå¿ÉÒÔ±»ÉùÃ÷Ϊ±äÁ¿¡¢Ö¸Õë»òÊý×éµÈ£¬ÓÃÒÔʵÏֽϸ´ÔÓµÄÊý¾Ý½á¹¹¡£½á¹¹ÌåͬʱҲÊÇÒ»Ð©ÔªËØµÄ¼¯ºÏ£¬ÕâÐ©ÔªËØ³ÆÎª½á¹¹ÌåµÄ³ÉÔ±(member)£¬ÇÒÕâЩ³ÉÔ±¿ÉÒÔΪ²»Í¬µÄÀàÐÍ£¬³ÉÔ±Ò»°ãÓÃÃû×Ö·ÃÎÊ¡£

ÎÒÃÇÀ´¿´¿´½á¹¹ÌåµÄ¶¨Ò壺

struct tag { member-list } variable-list;

struct£º½á¹¹Ì幨¼ü×Ö¡£

tag£º½á¹¹Ìå±êÇ©¡£

member-list£º½á¹¹Ìå³ÉÔ±ÁÐ±í¡£

variable-list£ºÎª½á¹¹ÌåÉùÃ÷µÄ±äÁ¿ÁÐ±í¡£

ÔÚÒ»°ãÇé¿öÏ£¬tag£¬member-list£¬variable-listÕâÈý²¿·ÖÖÁÉÙÒª³öÏÖÁ½¸ö¡£ÒÔÏÂΪʾÀý£º

// ¸Ã½á¹¹ÌåÓµÓÐ3¸ö³ÉÔ±£¬ÕûÐ͵Äa£¬×Ö·ûÐ͵Äb£¬Ë«¾«¶ÈÐ͵Äc
2 // ²¢ÇÒΪ¸Ã½á¹¹ÌåÉùÃ÷ÁËÒ»¸ö±äÁ¿s1
3 // ¸Ã½á¹¹ÌåûÓбêÃ÷Æä±êÇ©
4 struct{
5 int a;
6 char b;
7 double c;
8 } s1;
9 // ¸Ã½á¹¹ÌåÓµÓÐͬÑùµÄÈý¸ö³ÉÔ±
10 // ²¢ÇҸýṹÌå±êÃ÷Á˱êÇ©EXAMPLE
11 // ¸Ã½á¹¹ÌåûÓÐÉùÃ÷±äÁ¿
12 struct EXAMPLE{
13 int a;
14 char b;
15 double c;
16 };
17 //ÓÃEXAMPLE±êÇ©µÄ½á¹¹Ì壬ÁíÍâÉùÃ÷Á˱äÁ¿t1¡¢t2¡¢t3
18 struct EXAMPLE t1, t2[20], *t3;

ÒÔÉϾÍÊǼòµ¥½á¹¹ÌåµÄ´úÂëʾÀý¡£½á¹¹ÌåµÄ³ÉÔ±¿ÉÒÔ°üº¬ÆäËû½á¹¹Ì壬Ҳ¿ÉÒÔ°üº¬Ö¸Ïò×Ô¼º½á¹¹ÌåÀàÐ͵ÄÖ¸Õë¡£½á¹¹ÌåµÄ±äÁ¿Ò²¿ÉÒÔÊÇÖ¸Õë¡£

ÏÂÃæÎÒÃÇÀ´¿´¿´½á¹¹Ìå³ÉÔ±µÄ·ÃÎÊ¡£½á¹¹Ìå³ÉÔ±ÒÀ¾Ý½á¹¹Ìå±äÁ¿ÀàÐ͵IJ»Í¬£¬Ò»°ãÓÐ2ÖÖ·ÃÎÊ·½Ê½£¬Ò»ÖÖΪֱ½Ó·ÃÎÊ£¬Ò»ÖÖΪ¼ä½Ó·ÃÎÊ¡£Ö±½Ó·ÃÎÊÓ¦ÓÃÓÚÆÕͨµÄ½á¹¹Ìå±äÁ¿£¬¼ä½Ó·ÃÎÊÓ¦ÓÃÓÚÖ¸Ïò½á¹¹Ìå±äÁ¿µÄÖ¸Õë¡£Ö±½Ó·ÃÎÊʹÓýṹÌå±äÁ¿Ãû.³ÉÔ±Ãû£¬¼ä½Ó·ÃÎÊʹÓÃ(*½á¹¹ÌåÖ¸ÕëÃû).³ÉÔ±Ãû»òÕßʹÓýṹÌåÖ¸ÕëÃû->³ÉÔ±Ãû¡£ÏàͬµÄ³ÉÔ±Ãû³ÆÒÀ¿¿²»Í¬µÄ±äÁ¿Ç°×ºÇø·Ö¡£

struct EXAMPLE{
2 int a;
3 char b;
4 };
5 //ÉùÃ÷½á¹¹Ìå±äÁ¿s1ºÍÖ¸Ïò½á¹¹Ìå±äÁ¿µÄÖ¸Õës2
6 struct EXAMPLE s1, *s2;
7 //¸ø±äÁ¿s1ºÍs2µÄ³ÉÔ±¸³Öµ,×¢Òâs1.aºÍs2->a²¢²»ÊÇͬһ³ÉÔ±
8 s1.a = 5;
9 s1.b = 6;
10 s2->a = 3;
11 s2->b = 4;

×îºóÎÒÃÇÀ´¿´¿´½á¹¹Ìå³ÉÔ±´æ´¢¡£ÔÚÄÚ´æÖУ¬±àÒëÆ÷°´ÕÕ³ÉÔ±Áбí˳Ðò·Ö±ðΪÿ¸ö½á¹¹Ìå³ÉÔ±·ÖÅäÄÚ´æ¡£Èç¹ûÏëÈ·ÈϽṹÌåÕ¼¶àÉÙ´æ´¢¿Õ¼ä£¬ÔòʹÓùؼü×Ösizeof£¬Èç¹ûÏëµÃÖª½á¹¹ÌåµÄij¸öÌØ¶¨³ÉÔ±ÔڽṹÌåµÄλÖã¬ÔòʹÓÃoffsetofºê(¶¨ÒåÓÚstddef.h)¡£

struct EXAMPLE{
2 int a;
3 char b;
4 };
5 //»ñµÃEXAMPLEÀàÐͽṹÌåËùÕ¼ÄÚ´æ´óС
6 int size_example = sizeof( struct EXAMPLE );
7 //»ñµÃ³ÉÔ±bÏà¶ÔÓÚEXAMPLE´¢´æµØÖ·µÄÆ«ÒÆÁ¿
8 int offset_b = offsetof( struct EXAMPLE, b );

1.3 ±Õ°ü£¨Closure£©

±Õ°ü¾ÍÊÇÒ»¸öº¯Êý£¬»òÕßÒ»¸öÖ¸Ïòº¯ÊýµÄÖ¸Õ룬¼ÓÉÏÕâ¸öº¯ÊýÖ´ÐеķǾֲ¿±äÁ¿¡£

˵µÄͨË×Ò»µã£¬¾ÍÊDZհüÔÊÐíÒ»¸öº¯Êý·ÃÎÊÉùÃ÷¸Ãº¯ÊýÔËÐÐÉÏÏÂÎÄÖеıäÁ¿£¬ÉõÖÁ¿ÉÒÔ·ÃÎʲ»Í¬ÔËÐÐÉÏÎÄÖеıäÁ¿¡£

ÎÒÃÇÓýű¾ÓïÑÔÀ´¿´Ò»Ï£º

function funA(callback){
2 alert(callback());
3 }
4 function funB(){
5 var str = "Hello World"; // º¯ÊýfunBµÄ¾Ö²¿±äÁ¿£¬º¯ÊýfunAµÄ·Ç¾Ö²¿±äÁ¿
6 funA£¨
7 function£¨£©{
8 return str;
9 }
10 £©£»
11 }

ͨ¹ýÉÏÃæµÄ´úÂëÎÒÃÇ¿ÉÒÔ¿´³ö£¬°´³£¹æË¼Î¬À´Ëµ£¬±äÁ¿strÊǺ¯ÊýfunBµÄ¾Ö²¿±äÁ¿£¬×÷ÓÃÓòÖ»ÔÚº¯ÊýfunBÖУ¬º¯ÊýfunAÊÇÎÞ·¨·ÃÎʵ½strµÄ¡£µ«ÊÇÉÏÊö´úÂëʾÀýÖк¯ÊýfunAÖеÄcallback¿ÉÒÔ·ÃÎʵ½str£¬ÕâÊÇÎªÊ²Ã´ÄØ£¬ÒòΪ±Õ°üÐÔ¡£

2.blcok»ù´¡ÖªÊ¶

blockʵ¼ÊÉϾÍÊÇObjective-CÓïÑÔ¶Ô±Õ°üµÄʵÏÖ¡£

2.1 blockµÄÔ­Ðͼ°¶¨Òå

ÎÒÃÇÀ´¿´¿´blockµÄÔ­ÐÍ£º

NSString * ( ^ myBlock )( int );

ÉÏÃæµÄ´úÂëÉùÃ÷ÁËÒ»¸öblock(^)Ô­ÐÍ£¬Ãû×Ö½Ð×ömyBlock£¬°üº¬Ò»¸öintÐ͵IJÎÊý£¬·µ»ØÖµÎªNSStringÀàÐ͵ÄÖ¸Õë¡£

ÏÂÃæÀ´¿´¿´blockµÄ¶¨Ò壺

myBlock = ^( int paramA )
2 {
3 return [ NSString stringWithFormat: @"Passed number: %i", paramA ];
4 };

ÉÏÃæµÄ´úÂëÖУ¬½«Ò»¸öº¯ÊýÌ帳ֵ¸øÁËmyBlock±äÁ¿£¬Æä½ÓÊÕÒ»¸öÃûΪparamAµÄ²ÎÊý£¬·µ»ØÒ»¸öNSString¶ÔÏó¡£

×¢Ò⣺һ¶¨²»ÒªÍü¼ÇblockºóÃæµÄ·ÖºÅ¡£

¶¨ÒåºÃblockºó£¬¾Í¿ÉÒÔÏñʹÓñê×¼º¯ÊýÒ»ÑùʹÓÃËüÁË£º

myBlock(7);

ÓÉÓÚblockÊý¾ÝÀàÐ͵ÄÓï·¨»á½µµÍÕû¸ö´úÂëµÄÔĶÁÐÔ£¬ËùÒÔ³£Ê¹ÓÃtypedefÀ´¶¨ÒåblockÀàÐÍ¡£ÀýÈ磬ÏÂÃæµÄ´úÂë´´½¨ÁËGetPersonEducationInfoºÍGetPersonFamilyInfoÁ½¸öÐÂÀàÐÍ£¬ÕâÑùÎÒÃǾͿÉÒÔÔÚÏÂÃæµÄ·½·¨ÖÐʹÓøü¼ÓÓÐÓïÒåµÄÊý¾ÝÀàÐÍ¡£

 // Person.h
2 #import // Define a new type for the block
3 typedef NSString * (^GetPersonEducationInfo)(NSString *);
4 typedef NSString * (^GetPersonFamilyInfo)(NSString *);
5 @interface Person : NSObject
6 - (NSString *)getPersonInfoWithEducation:(GetPersonEducationInfo)educationInfo
7 andFamily:(GetPersonFamilyInfo)familyInfo;
8 @end

ÎÒÃÇÓÃÒ»ÕÅ´óʦÎÄÕÂÀïµÄͼÀ´×ܽáÒ»ÏÂblockµÄ½á¹¹£º

2.2 ½«block×÷Ϊ²ÎÊý´«µÝ

// .h
2 -(void) testBlock:( NSString * ( ^ )( int ) )myBlock;
3 // .m
4 -(void) testBlock:( NSString * ( ^ )( int ) )myBlock
5 {
6 NSLog(@"Block returned: %@", myBlock(7) );
7 }

ÓÉÓÚObjective-CÊÇÇ¿ÖÆÀàÐÍÓïÑÔ£¬ËùÒÔ×÷Ϊº¯Êý²ÎÊýµÄblockÒ²±ØÐëÒªÖ¸¶¨·µ»ØÖµµÄÀàÐÍ£¬ÒÔ¼°Ïà¹Ø²ÎÊýÀàÐÍ¡£

2.3 ±Õ°üÐÔ

ÉÏÎÄ˵¹ý£¬blockʵ¼ÊÊÇObjc¶Ô±Õ°üµÄʵÏÖ¡£

ÎÒÃÇÀ´¿´¿´ÏÂÃæ´úÂ룺

#import void logBlock( int ( ^ theBlock )( void ) )
2 {
3 NSLog( @"Closure var X: %i", theBlock() );
4 }
5 int main( void )
6 {
7 NSAutoreleasePool * pool;
8 int ( ^ myBlock )( void );
9 int x;
10 pool = [ [ NSAutoreleasePool alloc ] init ];
11 x = 42;
12 myBlock = ^( void )
13 {
14 return x;
15 };
16 logBlock( myBlock );
17 [ pool release ];
18 return EXIT_SUCCESS;
19 }

ÉÏÃæµÄ´úÂëÔÚmainº¯ÊýÖÐÉùÃ÷ÁËÒ»¸öÕûÐÍ£¬²¢¸³Öµ42£¬ÁíÍ⻹ÉùÃ÷ÁËÒ»¸öblock£¬¸Ãblock»á½«42·µ»Ø¡£È»ºó½«block´«µÝ¸ølogBlockº¯Êý£¬¸Ãº¯Êý»áÏÔʾ³ö·µ»ØµÄÖµ42¡£¼´Ê¹ÊÇÔÚº¯ÊýlogBlockÖÐÖ´ÐÐblock£¬¶øblockÓÖÉùÃ÷ÔÚmainº¯ÊýÖУ¬µ«ÊÇblockÈÔÈ»¿ÉÒÔ·ÃÎʵ½x±äÁ¿£¬²¢½«Õâ¸öÖµ·µ»Ø¡£

×¢Ò⣺blockͬÑù¿ÉÒÔ·ÃÎÊÈ«¾Ö±äÁ¿£¬¼´Ê¹ÊÇstatic¡£

2.4 blockÖбäÁ¿µÄ¸´ÖÆÓëÐÞ¸Ä

¶ÔÓÚblockÍâµÄ±äÁ¿ÒýÓã¬blockĬÈÏÊǽ«Æä¸´ÖƵ½ÆäÊý¾Ý½á¹¹ÖÐÀ´ÊµÏÖ·ÃÎʵģ¬ÈçÏÂͼ£º

ͨ¹ýblock½øÐбհüµÄ±äÁ¿ÊÇconstµÄ¡£Ò²¾ÍÊÇ˵²»ÄÜÔÚblockÖÐÖ±½ÓÐÞ¸ÄÕâЩ±äÁ¿¡£À´¿´¿´µ±blockÊÔ×ÅÔö¼ÓxµÄֵʱ£¬»á·¢Éúʲô£º

 myBlock = ^( void )
2 {
3 x++;
4 return x;
5 };

±àÒëÆ÷»á±¨´í£¬±íÃ÷ÔÚblockÖбäÁ¿xÊÇÖ»¶ÁµÄ¡£

ÓÐʱºòȷʵÐèÒªÔÚblockÖд¦Àí±äÁ¿£¬Ôõô°ì£¿±ð׿±£¬ÎÒÃÇ¿ÉÒÔÓÃ__block¹Ø¼ü×ÖÀ´ÉùÃ÷±äÁ¿£¬ÕâÑù¾Í¿ÉÒÔÔÚblockÖÐÐ޸ıäÁ¿ÁË¡£

»ùÓÚ֮ǰµÄ´úÂ룬¸øx±äÁ¿Ìí¼Ó__block¹Ø¼ü×Ö£¬ÈçÏ£º

__block int x;

¶ÔÓÚÓÃ__blockÐÞÊεÄÍⲿ±äÁ¿ÒýÓã¬blockÊǸ´ÖÆÆäÒýÓõØÖ·À´ÊµÏÖ·ÃÎʵģ¬ÈçÏÂͼ£º

3.±àÒëÆ÷ÖеÄblock

3.1 blockµÄÊý¾Ý½á¹¹¶¨Òå

ÎÒÃÇͨ¹ý´óʦÎÄÕÂÖеÄÒ»ÕÅͼÀ´ËµÃ÷£º

ÉÏͼÕâ¸ö½á¹¹ÊÇÔÚÕ»ÖеĽṹ£¬ÎÒÃÇÀ´¿´¿´¶ÔÓ¦µÄ½á¹¹Ì嶨Ò壺

struct Block_descriptor {
2 unsigned long int reserved;
3 unsigned long int size;
4 void (*copy)(void *dst, void *src);
5 void (*dispose)(void *);
6 };
7 struct Block_layout {
8 void *isa;
9 int flags;
10 int reserved;
11 void (*invoke)(void *, ...);
12 struct Block_descriptor *descriptor;
13 /* Imported variables. */
14 };

´ÓÉÏÃæ´úÂë¿´³ö£¬Block_layout¾ÍÊǶÔblock½á¹¹ÌåµÄ¶¨Ò壺

isaÖ¸Õ룺ָÏò±íÃ÷¸ÃblockÀàÐ͵ÄÀà¡£

flags£º°´bitλ±íʾһЩblockµÄ¸½¼ÓÐÅÏ¢£¬±ÈÈçÅжÏblockÀàÐÍ¡¢ÅжÏblockÒýÓüÆÊý¡¢ÅжÏblockÊÇ·ñÐèÒªÖ´Ðи¨Öúº¯ÊýµÈ¡£

reserved£º±£Áô±äÁ¿£¬ÎÒµÄÀí½âÊDZíʾblockÄÚ²¿µÄ±äÁ¿Êý¡£

invoke£ºº¯ÊýÖ¸Õ룬ָÏò¾ßÌåµÄblockʵÏֵĺ¯Êýµ÷ÓõØÖ·¡£

descriptor£ºblockµÄ¸½¼ÓÃèÊöÐÅÏ¢£¬±ÈÈç±£Áô±äÁ¿Êý¡¢blockµÄ´óС¡¢½øÐÐcopy»òdisposeµÄ¸¨Öúº¯ÊýÖ¸Õë¡£

variables£ºÒòΪblockÓбհüÐÔ£¬ËùÒÔ¿ÉÒÔ·ÃÎÊblockÍⲿµÄ¾Ö²¿±äÁ¿¡£ÕâЩvariables¾ÍÊǸ´ÖƵ½½á¹¹ÌåÖеÄÍⲿ¾Ö²¿±äÁ¿»ò±äÁ¿µÄµØÖ·¡£

3.2 blockµÄÀàÐÍ

blockÓм¸ÖÖ²»Í¬µÄÀàÐÍ£¬Ã¿ÖÖÀàÐͶ¼ÓжÔÓ¦µÄÀ࣬ÉÏÊöÖÐisaÖ¸Õë¾ÍÊÇÖ¸ÏòÕâ¸öÀà¡£ÕâÀïÁгö³£¼ûµÄÈýÖÖÀàÐÍ£º

_NSConcreteGlobalBlock£ºÈ«¾ÖµÄ¾²Ì¬block£¬²»»á·ÃÎÊÈκÎÍⲿ±äÁ¿£¬²»»áÉæ¼°µ½Èκο½±´£¬±ÈÈçÒ»¸ö¿ÕµÄblock¡£ÀýÈ磺

#include int main()
2 {
3 ^{ printf("Hello, World!\n"); } ();
4 return 0;
5 }

_NSConcreteStackBlock£º±£´æÔÚÕ»ÖеÄblock£¬µ±º¯Êý·µ»ØÊ±±»Ïú»Ù¡£ÀýÈ磺

#include int main()
2 {
3 char a = 'A';
4 ^{ printf("%c\n",a); } ();
5 return 0;
6 }

_NSConcreteMallocBlock£º±£´æÔÚ¶ÑÖеÄblock£¬µ±ÒýÓüÆÊýΪ0ʱ±»Ïú»Ù¡£¸ÃÀàÐ͵Äblock¶¼ÊÇÓÉ_NSConcreteStackBlockÀàÐ͵Äblock´ÓÕ»Öи´ÖƵ½¶ÑÖÐÐγɵġ£ÀýÈçÏÂÃæ´úÂëÖУ¬ÔÚexampleB_addBlockToArray·½·¨ÖеÄblock»¹ÊÇ_NSConcreteStackBlockÀàÐ͵ģ¬ÔÚexampleB·½·¨Öоͱ»¸´ÖƵ½Á˶ÑÖУ¬³ÉΪ_NSConcreteMallocBlockÀàÐ͵Äblock£º

void exampleB_addBlockToArray(NSMutableArray *array) {
2 char b = 'B';
3 [array addObject:^{
4 printf("%c\n", b);
5 }];
6 }
7 void exampleB() {
8 NSMutableArray *array = [NSMutableArray array];
9 exampleB_addBlockToArray(array);
10 void (^block)() = [array objectAtIndex:0];
11 block();
12 }

×ܽáһϣº

_NSConcreteGlobalBlockÀàÐ͵ÄblockҪôÊÇ¿Õblock£¬ÒªÃ´ÊDz»·ÃÎÊÈκÎÍⲿ±äÁ¿µÄblock¡£Ëü¼È²»ÔÚÕ»ÖУ¬Ò²²»ÔÚ¶ÑÖУ¬ÎÒÀí½âΪËü¿ÉÄÜÔÚÄÚ´æµÄÈ«¾ÖÇø¡£

_NSConcreteStackBlockÀàÐ͵ÄblockÓбհüÐÐΪ£¬Ò²¾ÍÊÇÓзÃÎÊÍⲿ±äÁ¿£¬²¢ÇÒ¸ÃblockÖ»ÇÒÖ»ÓÐÓÐÒ»´ÎÖ´ÐУ¬ÒòΪջÖеĿռäÊÇ¿ÉÖØ¸´Ê¹Óõģ¬ËùÒÔµ±Õ»ÖеÄblockÖ´ÐÐÒ»´ÎÖ®ºó¾Í±»Çå³ý³öÕ»ÁË£¬ËùÒÔÎÞ·¨¶à´ÎʹÓá£

_NSConcreteMallocBlockÀàÐ͵ÄblockÓбհüÐÐΪ£¬²¢ÇÒ¸ÃblockÐèÒª±»¶à´ÎÖ´ÐС£µ±ÐèÒª¶à´ÎÖ´ÐÐʱ£¬¾Í»á°Ñ¸Ãblock´ÓÕ»Öи´ÖƵ½¶ÑÖУ¬¹©ÒÔ¶à´ÎÖ´ÐС£

3.3 ±àÒëÆ÷ÈçºÎ±àÒë

ÎÒÃÇͨ¹ýÒ»¸ö¼òµ¥µÄʾÀýÀ´ËµÃ÷£º

#import typedef void(^BlockA)(void);
2 __attribute__((noinline))
3 void runBlockA(BlockA block) {
4 block();
5 }
6 void doBlockA() {
7 BlockA block = ^{
8 // Empty block
9 };
10 runBlockA(block);
11 }

ÉÏÃæµÄ´úÂ붨ÒåÁËÒ»¸öÃûΪBlockAµÄblockÀàÐÍ£¬¸ÃblockÔÚº¯ÊýdoBlockAÖÐʵÏÖ£¬²¢½«Æä×÷Ϊº¯ÊýrunBlockAµÄ²ÎÊý£¬×îºóÔÚº¯ÊýdoBlockAÖе÷Óú¯ÊýrunBloackA¡£

×¢Ò⣺Èç¹ûblockµÄ´´½¨ºÍµ÷Óö¼ÔÚÒ»¸öº¯ÊýÀïÃæ£¬ÄÇôÓÅ»¯Æ÷(optimiser)¿ÉÄÜ»á¶Ô´úÂë×öÓÅ»¯´¦Àí£¬´Ó¶øµ¼ÖÂÎÒÃÇ¿´²»µ½±àÒëÆ÷ÖеÄһЩ²Ù×÷£¬ËùÒÔÓÃ__attribute__((noinline))¸øº¯ÊýrunBlockAÌí¼Ónoinline£¬ÕâÑùÓÅ»¯Æ÷¾Í²»»áÔÚdoBlockAº¯ÊýÖжÔrunBlockAµÄµ÷ÓÃ×öÄÚÁªÓÅ»¯´¦Àí¡£

ÎÒÃÇÀ´¿´¿´±àÒëÆ÷×öµÄ¹¤×÷ÄÚÈÝ£º

#import __attribute__((noinline))
2 void runBlockA(struct Block_layout *block) {
3 block->invoke();
4 }
5 void block_invoke(struct Block_layout *block) {
6 // Empty block function
7 }
8 void doBlockA() {
9 struct Block_descriptor descriptor;
10 descriptor->reserved = 0;
11 descriptor->size = 20;
12 descriptor->copy = NULL;
13 descriptor->dispose = NULL;
14 struct Block_layout block;
15 block->isa = _NSConcreteGlobalBlock;
16 block->flags = 1342177280;
17 block->reserved = 0;
18 block->invoke = block_invoke;
19 block->descriptor = descriptor;
20 runBlockA(&block);
21 }

ÉÏÃæµÄ´úÂë½áºÏblockµÄÊý¾Ý½á¹¹¶¨Ò壬ÎÒÃÇÄܺÜÈÝÒ×µÃÀí½â±àÒëÆ÷ÄÚ²¿¶ÔblockµÄ¹¤×÷ÄÚÈÝ¡£

3.4 copy()ºÍdispose()

ÉÏÎÄÖÐÌáµ½£¬Èç¹ûÎÒÃÇÏëÒªÔÚÒÔºó¼ÌÐøÊ¹ÓÃij¸öblock£¬¾Í±ØÐëÒª¶Ô¸Ãblock½øÐп½±´²Ù×÷£¬¼´´ÓÕ»¿Õ¼ä¸´ÖƵ½¶Ñ¿Õ¼ä¡£ËùÒÔ¿½±´²Ù×÷¾ÍÐèÒªµ÷ÓÃBlock_copy()º¯Êý£¬blockµÄdescriptorÖÐÓÐÒ»¸öcopy()¸¨Öúº¯Êý£¬¸Ãº¯ÊýÔÚBlock_copy()ÖÐÖ´ÐУ¬ÓÃÓÚµ±blockÐèÒª¿½±´¶ÔÏóµÄʱºò£¬¿½±´¸¨Öúº¯Êý»áretainסÒѾ­¿½±´µÄ¶ÔÏó¡£

¼ÈÈ»ÓÐÓÐcopyÄÇô¾ÍÓ¦¸ÃÓÐrelease£¬ÓëBlock_copy()¶ÔÓ¦µÄº¯ÊýÊÇBlock_release()£¬ËüµÄ×÷Óò»ÑÔ¶øÓ÷£¬¾ÍÊÇÊÍ·ÅÎÒÃDz»ÐèÒªÔÙʹÓõÄblock£¬blockµÄdescriptorÖÐÓÐÒ»¸ödispose()¸¨Öúº¯Êý£¬¸Ãº¯ÊýÔÚBlock_release()ÖÐÖ´ÐУ¬¸ºÔð×öºÍcopy()¸¨Öúº¯ÊýÏà·´µÄ²Ù×÷£¬ÀýÈçÊͷŵôËùÓÐÔÚblockÖп½±´µÄ±äÁ¿µÈ¡£

4.×ܽá

ÒÔÉÏÄÚÈÝÊÇÎÒѧϰ¸÷´óʦµÄÎÄÕºó¶Ô×Ô¼ºÑ§Ï°Çé¿öµÄÒ»¸ö¼Ç¼£¬ÆäÖÐÓв¿·ÖÎÄ×ֺʹúÂëʾÀýÊÇÀ´×Ô´óʦµÄÎÄÕ£¬»¹ÓÐһЩ×Ô¼ºµÄÀí½â£¬ÈçÓдíÎó»¹Çë´ó¼Ò¿±Îó¡£

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

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

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

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

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


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


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