Привет всем!
В двух книгах (правда, на русском, то бишь переведенных) я прочла, что с помощью категории можно заместить метод в классе. Так вот — решила провести эксперимент.
Есть такой код:
Файл Сat.h:
#import <Foundation/Foundation.h>
@interface Cat : NSObject
{
@private
int weight;
int birthday;
}
- (NSString *)description;
- (void) Tail;
@end
Файл Cat.m:
#import "Cat.h"
@implementation Cat
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
weight = 65;
}
return self;
}
- (void) TailImpl
{
NSLog(@"Cat's tail");
}
- (void) Tail;
{
[self TailImpl];
}
- (NSString *)description
{
return @"Big, fat Cat";
}
@end
Файл main.m:
#import <Foundation/Foundation.h>
#import "Cat.h"
@interface Cat (Crack)
- (int) weight;
@end
@implementation Cat (Crack)
- (int) weight
{
return weight;
}
@end
@interface NSObject (Crack)
- (NSString*) description;
@end
@implementation NSObject (Crack)
- (NSString*) description
{
return @"Crazy Cat";
}
@end
int main (int argc, const char * argv[])
{
@autoreleasepool
{
Cat* cat = [Cat new];
[cat Tail];
NSLog(@"%d", [cat weight]);
NSNumber* pNum = [NSNumber numberWithInt:10];
// insert code here...
NSLog(@"%@", cat.description);
}
return 0;
}
Так вот — в этой программе я попыталась заместить метод description с помощью категории. (В принципе NSLog и так должен вызвать description, но я для ясности решила дернуть его здесь руками.)
Но в итоге выводится совсем не то, что я ожидала:
Cat's tail
65
Big, fat Cat
Вопрос — так можно все-таки заместить или книга врет?
Здравствуйте, XJess, Вы писали:
XJ>Так вот — в этой программе я попыталась заместить метод description с помощью категории. (В принципе NSLog и так должен вызвать description, но я для ясности решила дернуть его здесь руками.)
XJ>Но в итоге выводится совсем не то, что я ожидала:
XJ>
XJ>Cat's tail
XJ>65
XJ>Big, fat Cat
XJ>
XJ>Вопрос — так можно все-таки заместить или книга врет?
Книга не врет . Вы в примере заменили метод description у NSObject.
Попробуйте выполнить .
NSObject *obj = [[NSObject alloc] init];
NSLog(@"%@", obj);
Будет вывод Crazy Cat.