博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C 日记⑤ 内存管理、协议、Category 视频笔记
阅读量:6683 次
发布时间:2019-06-25

本文共 5806 字,大约阅读时间需要 19 分钟。

//内存管理第六课#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;}

 

 

 

转载地址:http://pmxao.baihongyu.com/

你可能感兴趣的文章
起航--dream
查看>>
c语言学习记录--求出1000以内所有完数,并输出其因子
查看>>
cisco nat配置
查看>>
配置YUM服务器[(图文)附禁ROOT方法]
查看>>
实例ansible-role :通过role进行二进制批量部署mariadb从而批量上线sql系统
查看>>
思科交换机镜像端口介绍配置
查看>>
独家揭秘语音视频聊天室开发顶尖制作教程
查看>>
冲向大牛之安卓:学习界面怎么在程序中画出来
查看>>
.net 签名加密实现的一种简单方法
查看>>
数据结构 试探法算法学习笔记
查看>>
nomad安装
查看>>
我的友情链接
查看>>
MySQL主备复制数据不一致的情况
查看>>
CU3ER非常Cool的3D效果的Flash Slider
查看>>
中财讯 爆遍历目录漏洞
查看>>
MongoDB 数据库备份脚本
查看>>
Linux常用命令
查看>>
10、《每天5分钟玩转Docker容器技术》学习-Docker命令之本地镜像管理
查看>>
shell脚本:输出昨天的日期
查看>>
corosync+pacemaker做高可用web集群
查看>>