//内存管理第六课#import#import "Person.h"#import "Dog.h"int main(int argc,const char *argv){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Person *xiaoLi=[[Person alloc] init]; //dog1 1 Dog *dog1=[[[Dog alloc] init] autorelease]; //把Dog1这条狗放在自动释放池里 上面的pool中 //dog1 2 xiaoLi.dog=dog1; //[dog1 release]; 有了autorelease 就不可以在release //因为dog 已经放到pool中 在release 则dog1会清除 [xiaoLi release] [pool release];//对拥有的非0(还存在)变量都release一次 return (0);}//dog.h#import @interface Dog:NSObject{ int _ID;}@property int ID;@end//dog.m#import @synthesize ID=_ID;-(void) dealloc //对象减到0(对象销毁时)自动调用{ NSLog(@"dog dealloc ");}//person.h#import #import "Dog.h"@interface Person:Object{ Dog *_dog;}@property (retain) Dog *dog;@end//person.m#import "Person.h"@implementation Person@Synthesize dog=_dog;-(void) dealloc // 对象减到0时自动调用这条{ self.dog=nil;//对狗的计数器减1 NSLog(@"person dealloc"); [super dealloc];}@end
协议
//第七课:协议int main(int argc,char *argv[]){ NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];}//只有一个头文件 以Protocol开头 方法没有方法体 继匙自蠳SObject@protocol MyProtocol-(void) init; -(int) updat:(int) time;@end//@optional 可以不实现 缺省 //@required 必须凳迪帜 //eg://@optional 可实现可不实现// -(void) init; //要实现的协议的名 用尖括号 多个用逗号隔开 @interface:Foo:NSObject 实现协议 id test=[[MyTest alloc] init]; if([test respondsToSelector:@select(showInfo)]){ } //案例 //protocol @protocol MyProtocol @optional-(void) print:(int) vlaue;//可选 @required-(int) printValue:(int)value1 andValue:(int)value2;@end //MyTest.h @interface MyTest:NSObject -(void) showInfo; @end //MyTest.m -(void) ShowInfo { NSLog(@"Show info is calling"); } //来源于MyProtocol协议 -(int) printValue:(int)value1 andValue:(int) value2 { NSLog(@"print value1 and %d value2 %d",value1,value2); return 0; } -(void) print:(int)value { NSLog(@"print vlaue %d",value); } @end #import # "MyTest.h"# "MyProtocol.h"int main(int argc,const char *argv[]){ @autorelease{ MyTest *myTest=[[MyTest alloc] init]; [myTest showInfo]; //把print转化成SEL类型的方法 OC所有函数都可以转换成SEL SEL sel=@selector(print:);// 有参数冒号注意 if([myTest respondsToSelector:sel]){ //判断myTest是否响应sel方法(print:) [myTest print:20]; } [myTest pirntValue:10 andValue:290]; [myTest release]; //用协议 id myProtocol =[[MyTest alloc] init]; if([myProtocol respondsToSelector:@selector(print:)]){ [myProtocol print:111]; } [myProtocol printValue:193 andValue:103]; [myProtocol release]; } return 0;}
第八章:代理模式
//Dod.h 文件#import@protocol DogBark;// 协议前向声明@class Dog;//@class 表示前向声明一个类@interface Dog:NSObject{ NSTimer *timer;// 定时器 int backCount;//叫的次数 int _ID; id delegate;//任何类型 存储主人 //告诉系统这个delegate是DogBark类型}@property int ID;@property (assign) id delegate;//指针赋值@end//方法二用协议来做//定义一个人和狗通讯的方式protocol@protocol DogBark -(void) bark:(Dog *)thisDog count:(int)count;@end//Dod.m文件#import "Dog.h"@implementation Dog@synthesize ID=_ID;@synthesize delegate;//构造函数ID 初始化-(id) init{ self=[super init]; if(self){ timer=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector: @selector(updateTimer:) userInfo:nil repeats:YES]; //创建一个定时器 每隔1.0秒就调用[self updateTimer:nil] } return self;}-(void) updateTimer:(id) arg{ backCount++; NSLog(@"dog bark %d",backCount); //通知狗的主人 [_dog setDelegate:self]; //把self传递到delegate中 [delegate bark:self count:barkCount]; //调用delegate里面的bark:count:方法 //向主人汇报}@end //Person.h#import #import "Dog.h"@interface Person:NSObject //实现协议{ DOg *_dog;}@property (retain) DOg *dog;@end//Person.m#import "Person.h"@implementation Person@synthesize dog=_dog;-(void) bark:(Dog *) thisDog count:(int)count{//当狗叫的时候来调用xiaoli人的这个方法 NSLog(@"person this dog %d bark %d",[thisDog ID],count);}-(void) dealloc//当对象清零时 调用{ self.dog=nil; [super dealloc];}// 重写setDog 告知狗的主人是谁-(void) setDog:(Dog *)dog{ if(_dog!=dog){ [_dog release]; _dog=[dog retain]; //通知_dog的主人是self }}-(Dog *) dog{ return _dog;}@end#import #import "Person.h"#import "Dog.h"int main(int argc,const char *argv[]){ @autoreleasepool{ Person *xiaoLi=[[Person alloc] init]; Dog *dog[[Dog alloc] int]; [dog setID:10]; [xiaoLi setDog:dog]; [dog release]; while(1){ [[NSRunLoop currentRunLoop] run]; } [xiaoLi release]; } return 0;}
第九章:Category
//Category 实际上是对类的扩展//1实现继承之外的扩展方法机制(给一个类扩展动态的或者静态的一些方法进去) //不能完全替代继承(原因就是下面的缺点不能扩展字段和变量) 但可以完成继承不能完成的。写起来比继承稍微麻烦但比继承好用//2可以做函数私有化//eg://interface Foo(Private)//Private 可以不写//-(void) test2;//@end//@implementation Foo//-(void) test{// [self test2]//}//-(void) test2//{// NSLog(@"test2")//}//@end//缺点:类别Category只能扩展函数,消息,不能扩展字段,变量等//命名规范//一般Category命名为:// 要扩展类名+扩展变量.[hm]//比如:// NSString+ReverseString.h// NSString+ReverseString.m// // UIImageView+WebCache.h// UIImageView+WebCache.m #import@implementation NSString (ReverseString)-(id) reverseString{ NSUInteger len=[self length]; //self 表示字符串本身 NSMutableString *retStr=[NSMutableString stringWithCapacity:len]; while(len>0){ unichar c=[self characterAtIndex:--len]; //从后去一个字符unichar NSLog(@"c is %C",c);//C国际字符 NSString *s=[NSString stringWithFormat:@"%C",c]; [retStr appendString:s] } return retStr;}@end#import #import "NSString+ReverseString.h"int main(int argc,const char *argv[]){ @autoreleasepool{ NSString *string="Hello Word"; NSString *retString=[string reverseString]; NSLog(@"%@",retString); } return 0;}