1¡¢Cocoa¶ÔÏóµÄ´´½¨
ÎÒÃǶ¼ÖªµÀ´´½¨Ò»¸ö¶ÔÏóÓÐÁ½²½£ºalloc ºÍ init£¨¶ÔÏó·ÖÅäºÍ³õʼ»¯£©£¬Á½²½È±Ò»²»¿É¡£³õʼ»¯Ò»°ã¶¼Êǽô½Ó×ŶÔÏó·ÖÅäµÄºóÃæ½øÐУ¬µ«ÊÇÕâÁ½¸ö²Ù×÷µÄ×÷ÓÃÊÇÍêÈ«²»Í¬µÄ¡£
·ÖÅä¶ÔÏ󣺾ÍÊÇCocoa´ÓÓ¦ÓóÌÐòµÄÐéÄâÄÚ´æÖÐΪ¶ÔÏó·ÖÅäÒ»¿éÄÚ´æ¡£Cocoa»á¸ù¾Ý¶ÔÏóµÄʵÀý±äÁ¿£¨ÀàÐͺͱäÁ¿µÄÅÅÁÐ˳Ðò£©¼ÆËãÄÚ´æ´óС²¢·ÖÅäÄڴ档ΪÁË·ÖÅäÄڴ棬ÄãÐèÒªÏòÀà¶ÔÏó£¨Àà¶ÔÏóÉÏÆªÏêϸ½²ÁËËüµÄÓÉÀ´ºÍ×÷Óã©·¢ËÍalloc
»òÕßallocWithZone:·¢ËÍÏûÏ¢¡£ÏûÏ¢·µ»ØÒ»¸öδ³õʼ»¯µÄÀàʵÀý¡£ÄÇ·¢ËÍ·ÖÅäÏûÏ¢³ýÁË·ÖÅäÄÚ´æÍ⣬»¹×öÁËÆäËûµÄһЩºÜÖØÒªµÄ¹¤×÷£º
1.¶ÔÏóµÄ±£³Ö(retain)ÊýÉèÖÃΪ1.
2.·ÖÅäµÄ¶ÔÏóµÄisaÖ¸ÕëÖ¸ÏòÀà¶ÔÏó¡£
3.°Ñ¶ÔÏóËùÓеÄʵÀý±äÁ¿³õʼ»¯Îª0.Ò²¿ÉÒÔÀí½â³É0µÄµÈ¼ÛÀàÐÍ£ºnil NULL
ÕâÑùËùÓеĶÔÏó¶¼ÓÐÁËisaÖ¸Õ룬¶øÇÒÖ¸ÏòËüÃǶÔÓ¦µÄÀà¶ÔÏó£¬ÕâÑù¶ÔÏó¾Í¿ÉÒÔÕÒµ½ËüÔËÐÐʱµÄÐÅÏ¢¡£±ÈÈç¶ÔÏóÔڼ̳вã´Î»ú¹¹ÉÏËùÔÚµÄλÖã¨ÄĸöÊǸ¸À࣬ÄĸöÊÇ×ÓÀàµÈÐÅÏ¢£©£¬ËüʵÏÖµÄÐÒ飬»¹ÓÐÄÜÏìӦʲôÏûÏ¢¡£
¼´±ãÈç´Ë£¬allocÖ®ºóµÄ¶ÔÏó»¹²»ÊÇÒ»¸ö¿ÉÓõĶÔÏ󣬶ÔÏó±ØÐë³õʼ»¯¡£
1.1³õʼ»¯¶ÔÏó
³õʼ»¯¹ý³Ì¾ÍÊǰѶÔÏóµÄʵÀý±äÁ¿ÉèÖóÉÓÐЧºÏÀíµÄÖµ£¬»òÕß˵ÄãÏëÒªµÄÊý¾Ý¡£Èç¹ûÄãµÄÀàûÓÐʵÏÖ³õʼ»¯·½·¨£¬Ëü»áµ÷Óø¸ÀàµÄ¡£
³õʼ»¯·½·¨µÄÐÎʽ
³õʼ»¯·½·¨ÊÇʵÀý·½·¨£¬·µ»ØµÄÊÇidÀàÐ͵ĶÔÏó¡£³õʼ»¯·½·¨Êǽ²¾¿ÐÎʽµÄ£¬²»ÄÜÂÒд¡£·½·¨Äã¿ÉÒÔÓвÎÊý£¬¶à¸öÒ²ÐУ¬µ«ÊDZØÐëÊÇinit¿ªÍ·,±ÈÈ磺
- (id)initWithArray:(NSArray *)array; (from NSSet) |
²ÎÊýÐÎʽ£ºWithType:
³õʼ»¯µÄÎÊÌâ
³õʼ»¯Ò²ÓÐÎÊÌ⣿ɶÎÊÌ⣡£¿ÓÐʱºò³õʼ»¯·µ»ØµÄ²¢²»ÊÇÒ»¸öеĶÔÏó¡£Ê²Ã´Ê±ºòÄØ£¿
±ÈÈ磺ÎÒÃÇÊìϤµÄµ¥ÀýģʽµÄʱºò¡£»¹Óб£³Ö¶ÔÏóij¸öÊôÐÔΨһµÄʱºò¡£ÕË»§ÀàµÄidΨһÐÔ£¬Èç¹û³õʼ»¯Ò»¸öidÊÇÒÑ´æÔÚµÄid,ÄǾÍÒª·µ»ØÒÑ´æÔÚid¶ÔÓ¦µÄÕË»§¶ÔÏó¡£
ÕâʱºòÎÒÃÇÐèÒª£º
1.ÊͷŸոշÖÅäµÄ¶ÔÏó£¨ÊDz»ÊǸоõºÜÀË·Ñ£¬¸Õ·ÖÅäÁËÓÖÒªÊÍ·Å£¬¶¼Ã»ÓÃÁËÄØ£¬Ã»°ì·¨µÄÊÂÇé°¡£©
2.·µ»ØÒÑ´æÔÚµÄÕË»§¶ÔÏó
ÓÐʱºòÄã³õʼ»¯¶ÔÏóʧ°ÜÁË£¬Ò²ÐèÒªÓÐһЩ²Ù×÷¡£Ôõô»áʧ°ÜÄØ£¿±ÈÈ磺initFromFile:
Õâ¸ö³õʼ»¯·½·¨£¬ËüÊÇÒª´ÓÒ»¸öÎļþ³õʼ»¯£¬ÍòÒ»Õâ¸öÎļþ²»´æÔÚ£¬ÄǾÍÊdzõʼ»¯Ê§°Ü£¬³õʼ»¯Ê§°ÜÁËÔõô°ì£º
1.ÊͷŸոշÖÅäµÄ¶ÔÏó
2.·µ»Ønil
¶ÔÏó²»ÄÜÖØ¸´³õʼ»¯£¬²»È»»á²úÉúNSInvalidArgumentExceptionÒì³£¡£
ʵÏÖ³õʼ»¯·½·¨
×Ô¶¨ÒåÀà¿ÉÄܾÍÐèÒª×Ô¼ºÐ´³õʼ»¯µÄ·½·¨ ÁË£¬¿ÉÒÔÓÐÒ»¸ö»ò¶à¸ö³õʼ»¯·½·¨£¬¿´ÄãÉè¼ÆµÄÀàµÄÐèÒª¡£²»¹ýʵÏÖ³õʼ»¯·½·¨ÐèÒª×ñÑÒÔϲ½Ö裺
1.ÏÈÒªµ÷Óø¸ÀàµÄ³õʼ»¯·½·¨
2.¼ì²é¸¸Àà³õʼ»¯·µ»ØµÄ¶ÔÏó£¬Èç¹ûÊÇnilÔò³õʼ»¯Ê§°Ü£¬Ò²·µ»Ønil
3.ÔÚ³õʼ»¯ÊµÀý±äÁ¿Ê±£¬Èç¹ûËüÃÇÊÇÆäËû¶ÔÏóµÄÒýÓ㬱ØÒªÊ±Òª½øÐÐretainºÍcopy
4.Èç¹û·µ»ØÒ»¸öÒÑ´æÔڵĶÔÏó£¬ÄÇÊ×ÏÈÊÍ·ÅзÖÅäµÄ¶ÔÏ󣨸ղÅÌáµ½µÄÕ˺ŵÄÀࣩ
5.Óöµ½ÎÊÌâ³õʼ»¯²»³É¹¦£¨±ÈÈç³õʼ»¯Îļþʧ°Ü£©£¬·µ»Ønil
6.Èç¹ûûÓÐÎÊÌ⣬·µ»Øself¡£³õʼ»¯Íê³É
ÏÂÃæÕâ¸öÀý×ÓÄÜ˵Ã÷Õ⼸¸ö²½Ö裬Çë¿´£º
- (id)initWithAccountID:(NSString *)identifier { if ( self = [super init] ) { Account *ac = [accountDictionary objectForKey:identifier]; if (ac) { // object with that ID already exists [self release]; return [ac retain]; } if (identifier) { accountID = [identifier copy]; // accountID is instance variable [accountDictionary setObject:self forKey:identifier]; return self; } else { [self release]; return nil; } } else return nil; } |
×¢Ò⣺×ÓÀà³õʼ»¯Ê±£¬±ØÐëÏȵ÷Óø¸ÀàµÄ³õʼ»¯·½·¨£¬ÒÔ±£Ö¤¼Ì³ÐÁ´Öи¸ÀàµÄʵÀý±äÁ¿µÃµ½ÕýÈ·µÄ¸³Öµ¡£
ÏÂͼ½âÊͼ̳ÐÁ´µÄ³õʼ»¯¹ý³Ì£º

1.2 dealloc·½·¨
deallocºÍinit·½·¨ÊÇÏàºôÓ¦µÄ¡£deallocÈ·±£µÄÊǶÔÏóµÄʵÀý±äÁ¿ºÍ¶¯Ì¬·ÖÅäµÄÄÚ´æ±»ÕýÈ·µÄÊÍ·Å¡£ºÍinit·½·¨Ïà·´£¬¸¸ÀàµÄdeallocÊÇÔÚÊÍ·ÅÁËÆäËûµÄÖ®ºó×îºóµ÷Óõġ£
- (void)dealloc { [accountDictionary release]; if ( mallocdChunk != NULL ) free(mallocdChunk); [super dealloc]; } |
1.3 ¹¤³§Àà·½·¨
¹¤³§Àà·½·¨°Ñ·ÖÅä¶ÔÏóºÍ³õʼ»¯ºÏ¶þΪһ£¬·µ»Ø´´½¨¶ÔÏ󣬶øÇÒ»¹×Ô¶¯ÊÍ·Å¡£ÕâЩ·½·¨µÄÐÎʽһ°ãÊÇ£º+ (type)className...
NSDate¹¤³§Àà·½·¨£º
+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs; + (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs; + (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs; |
²âÊÔϵÚÒ»¸ö´úÂ룺
NSDate *now = [NSDate dateWithTimeIntervalSinceNow: 0]; NSLog(@"now:%@",now); |
´òÓ¡³öÀ´now:2012-10-23 06:39:25 +0000
Òýµ±Ç°Ê±¼äΪ»ù×¼£¬0Êǵ±Ç°Ê±¼ä£¬+0000±íʾÊÇÊ±Çø£¬ÔÛÃÇÊÇ8Ê±Çø£¬+8ÊÇ14:39¡£Èç¹û²ÎÊýÊÇ24*60*60ÊÇÃ÷ÌìµÄʱ¼ä£¬Èç¹ûÊǸºÊýÄǾÍÊÇ×òÌìµÄʱ¼ä¡£
NSDataÌṩÏÂÃæµÄ¹¤³§·½·¨£º
+ (id)dataWithBytes:(const void *)bytes length:(unsigned)length; + (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length; + (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length freeWhenDone:(BOOL)b; + (id)dataWithContentsOfFile:(NSString *)path; + (id)dataWithContentsOfURL:(NSURL *)url; + (id)dataWithContentsOfMappedFile:(NSString *)path; |
¾Ù¸ö + (id)
dataWithContentsOfURLµÄÀý×Ó£¬ÏÂÔØÍ¼Æ¬£¬ºÁÎÞѹÁ¦¡£
NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"]; NSData * data = [NSData dataWithContentsOfURL:url]; UIImage *image = [[UIImage alloc]initWithData:data]; |
2¡¢ÔËÐÐʱÄÚÊ¡µÄÄÜÁ¦
ÄÚÊ¡£¨Introspection£©ÊÇÃæÏò¶ÔÏóÓïÑԺͻ·¾³µÄÖØÒªÌØÐÔ£¬Objective-CºÍCocoaÔÚÕâ·½Ãæ×öµÄºÜºÃ¡£ÄÚÊ¡ÊǶÔÏó×Ô¼º¼ì²é×Ô¼º×öΪÔËÐÐʱ¶ÔÏóÏêϸÐÅÏ¢µÄÒ»ÖÖÄÜÁ¦¡£ÕâЩÏêϸÐÅÏ¢°üÀ¨¶ÔÏóÔڼ̳ÐÊ÷ÉϵÄλÖ㬶ÔÏóÊÇ·ñ×ñÑÌØ¶¨µÄÐÒ飬ÒÔ¼°ÊÇ·ñ¿ÉÒÔÏìÓ¦ÌØ¶¨µÄÏûÏ¢¡£NSObjectÐÒéºÍÀඨÒåÁ˺ܶàÄÚÊ¡·½·¨£¬ÓÃÓÚ²éѯÔËÐÐʱÐÅÏ¢£¬ÒÔ±ã¸ù¾Ý¶ÔÏóµÄÌØÕ÷½øÐÐʶ±ð¡£
Áé»îµÄʹÓÃÄÚÊ¡ÄÜÁ¦¿ÉÒÔÈÃÄãµÄ³ÌÐò¸üÎȶ¨Ç¿´ó¡£ÄÚÊ¡¿ÉÒÔ±ÜÃâ´íÎ󵨽øÐÐÏûÏ¢ÅÉ·¢¡¢¶ÔÏóÏàµÈµÄ´íÎóÅжϵÈÎÊÌâ¡£ÏÂÃæ½éÉÜÄÚÊ¡µÄһЩʵÓ÷½·¨£º
2.1 ¶¨Î»¼Ì³Ð¹ØÏµ
NSObjectÐÒéÉùÃ÷Á˼¸¸ö·½·¨£¬ÓÃÓÚÈ·¶¨¶ÔÏóÔÚÀà²ã´ÎÖеÄλÖá£class·µ»ØÀàµÄClass¶ÔÏó¡£superclass·µ»Ø¸¸ÀàµÄClass¶ÔÏ󡣿´ÏÂÃæÀý×Ó£º
while ( id anObject = [objectEnumerator nextObject] ) { if ( [self class] == [anObject superclass] ) { // do something appropriate... } } |
·µ»ØµÄÁ½¸öClass¶ÔÏó¿´ÊÇ·ñÏàµÈ¡£
¼ì²éÀà¶ÔÏóµÄ´ÓÊô¹ØÏµ£ºisKindOfClass:ÅжÏÊÇ·ñÊÇÕâ¸öÀàµÄ»òÕâ¸öÀàµÄ×ÓÀàµÄʵÀý¡£isMemberOfClass:
Õâ¸ö¸üÑϸñЩ£¬ÅжÏÊÇ·ñÊÇÕâ¸öÀàµÄʵÀý¡£Àý×Ó£º
if ([item isKindOfClass:[NSData class]]) { const unsigned char *bytes = [item bytes]; unsigned int length = [item length]; // ... } |
2.2 ÅжϷ½·¨µÄʵÏÖ»òÕßÊÇ·ñ×ñÑij¸öÐÒé
NSObject»¹ÓÐÁ½¸ö¹¦Äܸü¼ÓÇ¿´óµÄÄÚÊ¡·½·¨£¬¼´respondsToSelector:ºÍconformsToProtocol:¡£Á½¸öÊÇʵÀý·½·¨¡£respondsToSelectorÅжÁ¶ÔÏóÊÇ·ñʵÏÖij¸öµÄ·½·¨£¬conformsToProtocolÅжÏÊÇ·ñ×ñÑÖ¸¶¨µÄÕýʽÐÒ飨ÕýÊÇÐÒéµÄÒâ˼ÊÇʵÏÖ¸ÃÐÒéµÄËùÓз½·¨£©¡£ËùÓм̳ÐNSObjectµÄÀà¶¼ÓÐÓÐÕâÁ½¸ö·½·¨¡£
respondsToSelectorÀý×Ó£º
- (void)doCommandBySelector:(SEL)aSelector { if ([self respondsToSelector:aSelector]) { [self performSelector:aSelector withObject:nil]; } else { [_client doCommandBySelector:aSelector]; } } |
2.3 ¶ÔÏóµÄ±È½Ï
hashºÍisEqual:·½·¨¶¼ÔÚNSObjectÐÒéÖÐÉùÃ÷£¬Çұ˴˹ØÏµ½ôÃÜ¡£ÊµÏÖhash·½·¨»á·µ»ØÒ»¸öÕûÐÍÊý¡£Á½¸ö¶ÔÏóÏàµÈÒâζ×ÅËüÃÇÓÐÏàͬµÄ¹þÏ£Öµ¡£Èç¹ûÄúµÄ¶ÔÏó¿ÉÄܱ»°üº¬ÔÚÏóNSSetÕâÑùµÄ¼¯ºÏÖУ¬ÔòÐèÒª¶¨Òåhash·½·¨£¬²¢È·±£¸Ã·½·¨ÔÚÁ½¸ö¶ÔÏóÏàµÈµÄʱºò·µ»ØÏàͬµÄ¹þÏ£Öµ¡£²»¹ýNSObjectÀàÖÐȱʡµÄisEqualʵÏÖÖ»ÊǼòµ¥µØ¼ì²éÖ¸ÕëÊÇ·ñÏàµÈ¡£
isEqual·½·¨Àý×Ó£º
- (void)saveDefaults { NSDictionary *prefs = [self preferences]; if (![origValues isEqual:prefs]) [Preferences savePreferencesToDefaults:prefs]; } |
Èç¹û×ÓÀàÔö¼ÓÁËʵÀý±äÁ¿£¬±È½Ï×ÓÀàÐèÒª¶Ô×ÓÀàµÄʵÀý±äÁ¿Ò²×ö±È½Ï²ÅÄÜÈ·¶¨¶ÔÏóÊÇ·ñÏàµÈʱ£¬ÐèÒªÖØÔØisEqual·½·¨£º
- (BOOL)isEqual:(id)other { if (other == self) return YES; if (!other || ![other isKindOfClass:[self class]]) return NO; return [self isEqualToWidget:other]; } - (BOOL)isEqualToWidget:(MyWidget *)aWidget { if (self == aWidget) return YES; if (![(id)[self name] isEqual:[aWidget name]]) return NO; if (![[self data] isEqualToData:[aWidget data]]) return NO; return YES; } |
3¡¢¶ÔÏó¿É±äÐÔ(mutable)
3.1 ΪʲôҪÓпɱäÓë²»¿É±ä¶ÔÏó
´´½¨¶ÔÏóµÄʱºò£¬Ñ¡¿É±äµÄ¶ÔÏó»¹ÊÇÑ¡²»¿É±äµÄ¶ÔÏóÄØ£¿Ôõô¾ö¶¨ÄØ¡£ÏÈ¿´¿´ÎªÊ²Ã´ÒªÓпɱäÓë²»¿É±äÕâÁ½ÖÖ¶ÔÏóµÄ´æÔÚ¡£
¿É±äµÄ¶ÔÏóµÄÀàÇ°Ãæ¶¼ÓÐ MutableµÄ¹Ø¼ü×Ö£¬ÕâЩÀàÓУº
NSMutableArray
NSMutableDictionary
NSMutableSet
NSMutableIndexSet
NSMutableCharacterSet
NSMutableData
NSMutableString
NSMutableAttributedString
NSMutableURLRequest
ËüÃǶ¼ÊǶÔÓ¦µÄ²»¿É±äÀàµÄ×ÓÀà¡£
Èç¹û¶ÔÏó¶¼ÊǿɱäµÄ£¬ÄÇÔÚijЩ³¡¾°ÖÐÊǺܲ»°²È«ºÍ²»¿É¿¿µÄ¡£±ÈÈçÄãµÄij¸ö¶ÔÏóµ±×ö²ÎÊý´«¸øÁËij¸ö·½·¨£¬Ä㲻ϣÍûÄãµÄ¶ÔÏ󱻸ı䡣ÕâʱÕâ¸ö·½·¨È´ÄãµÄ±äÁ¿¸Ä±äÁË£¬ÕâÊÇÄã²»ÏëÒªµÄ½á¹û¡£¶øÔÚÁíÍâһЩ³¡¾°È´Ïà·´¡£OK£¬ÎªÁ˶ÔÓ¦²»Í¬µÄ³¡¾°£¬¶ÔÏó¾Í±ØÐëÓпɱäÓë²»¿É±äÖ®·ÖÁË¡£
3.2 ʲôʱºòÓÿɱä¶ÔÏó
µ±ÐèÒªÔÚ¶ÔÏó´´½¨Ö®ºóƵ·±»ò²»¶ÏµØ¶ÔÆäÄÚÈݽøÐÐÐÞ¸Äʱ£¬ÇëʹÓÿɱä¶ÔÏó
ÓÐЩʱºò£¬ÓÃÒ»¸ö²»¿É±ä¶ÔÏóÈ¡´úÁíÒ»¸ö¿ÉÄܸüºÃ¡£±ÈÈ磬´ó¶àÊý±£Áô×Ö·û´®µÄʵÀý±äÁ¿¶¼Ó¦¸Ã±»¸³ÖµÎªÒ»¸ö²»¿É±äµÄNSString¶ÔÏ󣬶øÕâЩ¶ÔÏóÔòÓá°setter¡±·½·¨À´½øÐÐÌæ»»¡£
ÒÀ¿¿·µ»ØÀàÐÍÀ´½øÐпɱäÐÔÌáʾ¡£
Èç¹ûÄã²»ÄÜÈ·¶¨Ò»¸ö¶ÔÏóÊǿɱäµÄ£¬Ôò½«Ëüµ±³É²»¿É±äµÄ´¦Àí¡£
4¡¢´´½¨µ¥Àý
´´½¨µ¥ÀýµÄ²½Ö裺
1.ÉùÃ÷Ò»¸öµ¥Àý¶ÔÏóµÄ¾²Ì¬ÊµÀý£¬²¢³õʼ»¯Îªnil¡£
2.ÔÚ¸ÃÀàµÄÀ๤³§·½·¨£¨Ãû³ÆÀàËÆÓÚ¡°sharedInstance¡±»ò¡°sharedManager¡±£©ÖÐÉú³É¸ÃÀàµÄÒ»¸öʵÀý£¬µ«½öµ±¾²Ì¬ÊµÀýΪnilµÄʱºò¡£
3.ÖØÔØallocWithZone:·½·¨£¬È·±£µ±Óû§ÊÔͼֱ½Ó£¨¶ø²»ÊÇͨ¹ýÀ๤³§·½·¨£©·ÖÅä»ò³õʼ»¯ÀàµÄʵÀýʱ£¬²»»á·ÖÅä³öÁíÒ»¸ö¶ÔÏó¡£
ʵÏÖ»ù±¾ÐÒé·½·¨£ºcopyWithZone:¡¢release¡¢retain¡¢retainCount¡¢ºÍautorelease
£¬ÒÔ±£Ö¤µ¥ÀýµÄ״̬¡£
ʵÏÖµ¥ÀýµÄ´úÂëÀý×Ó£º
static MyGizmoClass *sharedGizmoManager = nil; + (MyGizmoClass*)sharedManager { @synchronized(self) { if (sharedGizmoManager == nil) { [[self alloc] init]; // assignment not done here } } return sharedGizmoManager; } + (id)allocWithZone:(NSZone *)zone { @synchronized(self) { if (sharedGizmoManager == nil) { sharedGizmoManager = [super allocWithZone:zone]; return sharedGizmoManager; // assignment and return on first allocation } } return nil; //on subsequent allocation attempts return nil } - (id)copyWithZone:(NSZone *)zone { return self; } - (id)retain { return self; } - (unsigned)retainCount { return UINT_MAX; //denotes an object that cannot be released } - (void)release { //do nothing } - (id)autorelease { return self; } |
|