在c++中我們可以多繼承來實作代碼複用和封裝使程式更加簡練。在objective-c中隻能單繼承,不能多繼承,那麼除了協定protocol之外,我們可以實作類似多繼承的一個方法就是,分類(category,又稱類别)。類别可以不修改原來的類(父類),和派生類的情況下,為原有的類增加新的方法,但是分類不能增加執行個體變量。
格式(format):
@interface class_name(category_name)<protocol,....>
method _declaration;
....
@end
@implementation class_name(category_name)
method_implementation;
...
@end
建立一個AddressCard類,然後再建立一個檔案 AddressCardCategory 用來聲明和實作分類(category)
1 #import <Foundation/Foundation.h>
2
3 @interface AddressCard : NSObject<NSCoding>{
4 NSString* name;
5 NSString* email;
6 }
7 @property (nonatomic,retain)NSString* name;
8 @property (nonatomic,retain)NSString* email;
9 -(id)initWithName:(NSString*)_name andEmail:(NSString*)_email;
10
11 @end
1 #import "AddressCard.h"
2
3 @implementation AddressCard
4 @synthesize name,email;
5 -(id)initWithName:(NSString*)_name andEmail:(NSString*)_email{
6 if(self= [super init])
7 {
8 self.name=_name;
9 self.email=_email;
10 }
11 return self;
12 }
13 -(void)encodeWithCoder:(NSCoder *)aCoder{
14 [aCoder encodeObject:name forKey:@"_name"];
15 [aCoder encodeObject:email forKey:@"_email"];
16 }
17
18 -(id)initWithCoder:(NSCoder*)aDecoder{
19 if(self=[super init])
20 {
21 self.name=[aDecoder decodeObjectForKey:@"_name"];
22 self.email=[aDecoder decodeObjectForKey:@"_email"];
23 }
24 return self;
25 }
26 -(void)dealloc{
27 [name release];
28 [email release];
29 [super dealloc];
30 }
31 @end
#import <Foundation/Foundation.h>
#import "AddressCard.h"
@interface AddressCard(category)
-(void)uppercaseName;
@end
1 #import "AddressCardCategory.h"
2
3 @implementation AddressCard(Category)
4 -(void)uppercaseName{
5 self.name= [name uppercaseString];
6 }
7
8 @end
1 #import <Foundation/Foundation.h>
2 #import "AddressCardCategory.h"
3 int main (int argc, const char * argv[])
4 {
5
6 @autoreleasepool {
7 AddressCard* card1=[[AddressCard alloc]initWithName:@"shou" andEmail:@"[email protected]"];
8 [NSKeyedArchiver archiveRootObject:card1 toFile:@"/tmp/AddressCard.txt"];
9 AddressCard* card4=[NSKeyedUnarchiver unarchiveObjectWithFile:@"/tmp/AddressCard.txt"];
10 NSLog(@"card 4 %@ ,%@",card4.name,card4.email);
11 [card4 uppercaseName];
12 NSLog(@"card 4 %@ ,%@",card4.name,card4.email);
13 [card1 release];
14 //[card4 release];
15
16
17 }
18 return 0;
19 }
執行結果:
2013-08-20 17:12:04.751 AddressCard[1079:707] card 4 shou ,[email protected]
2013-08-20 17:12:04.758 AddressCard[1079:707] card 4 SHOU ,[email protected]

轉載于:https://www.cnblogs.com/james1207/p/3270922.html