在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
为了更好的使得自己理解并掌握oc的语法,我在看完大部分oc的基础后,开始自己在notepad++上编辑一个测试的示例程序。 本以为很简单的几个类的程序,让我调试了好长时间,看来这种代码的编写方式真的是不错。让我对一些细小的地方更加的留意。 测试的程序主要包含了一个父类Animal、一个子类Dog、一个category-DogExt、一个protocol Print以及一个测试主程序文件main. 测试结果如下:有一点不符合我的预期结果,就是函数instancesRespondToSelector. Dog这个类明明有一个类方法printDogCount 可是结果却显示没有这个函数。后来我直接performSelector却可以执行了。同时我知道NSObject包含了一个返回类名的方法class 我将@selector(printDogCount)替换为@selector(class)却完美执行。真是奇怪!!!难道是bug不成。以后在关注吧。 测试结果: Animal initialize Dog initialize There is 1 Dog(s) 2011-11-05 00:35:12.989 Hello[1339:707] Buddy 2011-11-05 00:35:12.990 Hello[1339:707] Wow! There is 4 feet of Dog! There is 2 Dog(s) 2011-11-05 00:35:12.991 Hello[1339:707] Tom 2011-11-05 00:35:12.992 Hello[1339:707] Wow! dog is not a member Animal dog is kind of Animal dog respondsToSelector 'Wow' and performs it 2011-11-05 00:35:12.992 Hello[1339:707] Buddy 2011-11-05 00:35:12.993 Hello[1339:707] Wow! Dog not instancesRespondToSelector 'printDogCount' There is 2 Dog(s) dog can play ball by category ext 2011-11-05 00:35:12.993 Hello[1339:707] Buddy has 4 feet dog conformsToProtocol Print There is 3 Dog(s) dog3 retain count=1 dog3 retain count=2 dog3 retain count=3 dog3 retain count=2 dog3 retain count=1 There is 2 Dog(s) There is 1 Dog(s) There is 0 Dog(s)
源码
Animal.h
/* Animal Class */ #import <Foundation/Foundation.h> #import "Print.h" //a protocol
@interface Animal : NSObject <Print> { NSString* _name; } -(Animal*) init; -(void) Wow; -(int) FeetNumber; -(NSString*) Name; -(void) setName : (NSString*) name ; @end
Animal.m
#import "Animal.h" #import <stdio.h>
@implementation Animal
+(void) initialize { printf("Animal initialize\r\n"); }
-(Animal*) init { self = [super init]; _name = [[NSString alloc] initWithString : @"Animal"]; //自己分配内存 return self; }
-(void) dealloc { [_name release]; }
-(void) Wow { printf("Animal Wow!\r\n"); } -(int) FeetNumber { return -1; } -(NSString*) Name { return _name; } -(void) setName : (NSString*)new_name { [_name release]; //释放内存 _name = [new_name copy]; //拷贝后存放 }
//protocol
-(void) Print { NSString* str = [[NSString alloc] initWithFormat:@"%@ has %i feet\r\n",_name,[self FeetNumber]];
NSLog(@"%@",str);
[str release]; }
@end
Dog.h
#import <Foundation/Foundation.h> #import "Animal.h"
@interface Dog : Animal { @public //测试成员变量存取权限 int public_var; @protected int protected_var; }
+(void) printDogCount; //类方法
@end
Dog.m
#import "Dog.h" #import <stdio.h>
@implementation Dog
static int count = 0; //类似与类的静态变量
+(void) initialize { printf("Dog initialize\r\n"); }
-(Dog*) init { self = [super init]; [self setName : @"Dog" ]; count ++ ; [Dog printDogCount];//调用类方法 return self; }
-(void) dealloc { count --; [Dog printDogCount];
[super dealloc]; }
+(void) printDogCount { printf("There is %d Dog(s)\r\n",count); }
-(void) Wow { NSLog(@"%@",[self Name]); NSLog(@" Wow!\r\n"); } -(int) FeetNumber //狗有四条腿 { return 4; } @end DogExt.h
#import "Dog.h"
@interface Dog (Ext) -(void) PlayBall; @end DogExt.m
#import "DogExt.h"
@implementation Dog (Ext) -(void) PlayBall { printf("dog can play ball by category ext\r\n"); } @end
Print.h
@protocol Print -(void) Print; @end main.m
#import <Foundation/Foundation.h> #import <Foundation/NSAutoreleasePool.h> #import <stdio.h> #import "Dog.h" #import "DogExt.h"
int main( int argc, const char *argv[] ) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Dog *dog = [[Dog alloc] init ]; [dog setName : @"Buddy"]; [dog Wow];
int dog_feet = [dog FeetNumber]; //通过成员调用类方法 printf("There is %d feet of Dog!\r\n",dog_feet);
id dog2 = [[Dog alloc] init ]; [dog2 setName : @"Tom"]; //有method就反应,没有就不反应 [dog2 Wow];
dog->public_var = 2; //测试成员变量存取权限 //dog->protected_var = 5;
//dynamic types if( [dog isMemberOfClass : [Animal class]] == YES ) { printf("dog is a member Animal\r\n"); } else { printf("dog is not a member Animal\r\n"); }
if( [dog isKindOfClass : [Animal class]] == YES ) { printf("dog is kind of Animal\r\n"); } else { printf("dog is not kind of Animal\r\n"); }
if([dog respondsToSelector : @selector(Wow) ] == YES) { printf("dog respondsToSelector 'Wow' and performs it\r\n"); [dog performSelector : @selector(Wow)]; } else { printf("dog not respondsToSelector 'Wow' \r\n"); }
if([Dog instancesRespondToSelector : @selector(printDogCount) ] == YES) { printf("Dog instancesRespondToSelector 'printDogCount' \r\n"); } else { printf("Dog not instancesRespondToSelector 'printDogCount' \r\n"); } [Dog performSelector : @selector(printDogCount)];
//Categories [dog PlayBall];
//protocol id <Print> id_print = dog; [id_print Print]; if( [dog conformsToProtocol : @protocol(Print)] == YES) { printf("dog conformsToProtocol Print\r\n"); }
//Memory Dog *dog3 = [[Dog alloc] init]; printf("dog3 retain count=%d\r\n",(int)[dog3 retainCount]); Dog *ref1 = [dog3 retain]; printf("dog3 retain count=%d\r\n",(int)[dog3 retainCount]); Dog *ref2 = [dog3 retain]; printf("dog3 retain count=%d\r\n",(int)[dog3 retainCount]);
[dog3 release]; printf("dog3 retain count=%d\r\n",(int)[dog3 retainCount]); [ref1 release]; printf("dog3 retain count=%d\r\n",(int)[dog3 retainCount]); [ref2 release];
[dog release]; [dog2 release]; [pool release]; }
注:创建工程时选择Mac OS X下的Command Line ,Type:Foundation 不选择自动垃圾收集
|
请发表评论