类目
- 定义:类目可以为一个现有的类扩展新的方法,扩展的方法会成为原始类的一部分且可以被子类继承
- 创建FileType为Category的文件
- 注意事项:
1、类目只能增加方法不能增加属性
2、可以重写原始类的方法(无法调用原始类的被重写的方法)
- 例:
#import "NSArray+Log.h"
@implementation NSArray (Log)
/*
(
@"jack",@"tom"
)
*/
- (NSString *)description {
//@"(jack,tom,)"
NSMutableString *desc = [NSMutableString stringWithString:@"(\n"];
for (int i=0;i<self.count;i++) {
NSString *s = self[i];
[desc appendFormat:@" %@",s];
if (i != self.count-1) {
[desc appendString:@",\n"];
}
}
[desc appendString:@"\n)"];
return desc;
}
@end
延展(类目中的一个用法)
- 定义:在类的实现文件.m中定义类目,叫延展
定时器的使用
/*
scheduledTimerWithTimeInterval 作用 :
1.创建了一个定时器对象
2.启动了这个创建的定时器对象
3.userInfo 用于将参数传给定时器方法中的
*/
NSArray *array = @[@"ad",@"mfmf"]
//简单用法
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(timeAction:)
userInfo:array
repeats:YES];
-(void) timeAction:(NSTimer *)time{
NSArray *array = timer.userInfo;
_index++;
if(_index == 5){
//终止定时器
[timer invalidate];
}
}
//timerWithTimeInterval : 只是创建了一个定时器对象,而没有启动这个定时器
NSTimer *timer = [NSTimer timerWithTimeInterval:1
target:self
selector:@selector(timeAction:)
userInfo:array
repeats:YES];
//启动定时器
[timer fire];
[[NSRunLoop currentRunLoop] run];
协议Protocol
- 协议是定义了一组方法,让其他类实现
- 协议本身不是类
@protocol/*声明协议*/ Protocol <NSObject>
@required//修饰协议方法 必须实现的
-(void) finishTask;
-(void) dontLate;
@optional //可选实现
@end
/*
* 签订者,在.h 文件中<协议>
*/
@interface Studnet :NSObject<Protocol>
@end
/*
* .m 文件中直接实现
*/
@implementation Student
-(void) finishTask{}
-(void) dontLate{}
@end
代理(委托)设计模式
- 设计模式定义: 设计模式(Design Pattern) 描述了软件开发过程中若干重复出现的问题的解决方案,目的是提高程序的课扩展性和维护性。
- 利用协议(java 接口) 分别实现,接口方法来实现传入对应的对象(类似java泛型)
内存管理
- 概念: 内存管理是关于如何管理对象声明周期的编程原则
- 引用计数: 所有Objective-c的对象都有一个计数器,这个计数器我们成为引用计数
每个对象都有一个retainCount引用计数,表示当前对象被引用的数量
1、调用retain方法,计数+1,调用release方法,计数减一
2、当引用计数为0时,说明没有“引用”,此对象会被系统销毁
alloc、retain、release
- alloc用来创建对象,创建完成后,引用计数为1,只调用一次。
- retain是引用计数+1,可以调用多次。
- release使用引用计数-1,可以调用多次
- 当引用计数为0时,对象会被系统内存中销毁,销毁之前,会调用此对象的dealloc方法
黄金法则: 如果对一个对象是用来额alloc,[mutable]copy,retain,那么你必须使用相应的release或者autorelease释放。
- @property的使用 一个类有众多属性,需要使用@property 对所有的属性定义set和get方法
例
/**.h**/
@interface User:NSObject{}
/**
* @property的作用:
* 1、生成一个_username的属性,此属性是private,不能被继承的
* 2、为此属性生成set/get方法
*/
@property (1,2,3) NSString *username;
@end
/**.m**/
@syntherize username = _name; (重命名)
1、原子性:
- atomic:多线程环境下,存在线程保护,默认
- nonatomic:多线程环境下,不存在线程保护
2、赋值:
- assign:直接赋值,默认(对象之外的类型,如基本数据类型、结构体类型)
- retain:保留对象(所有对象)
- copy:拷贝对象(NSString对象)
3、读写性:
- readwrite:生成getter,setter方法,默认
- readonly:只生成getter方法
- 自动释放池
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//将对象添加到自动释放池
[pool addObject:(id)];
//autorelease:将P对象添加到自动释放池中,引用计数不会-1
[p autorelease];
//当自动释放池销毁的时候,会对池子中的每一个对象发送一个release消息(调用了release方法),如果p对象的引用计数是2 p对象的引用计数只会-1 并不会销毁
[pool release];
//创建自动释放池的简便语法
@autoreleasepool{
[p autorelease];
}
//---------------自动释放池的嵌套--------------
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];
//p1添加到pool1中
[p1 autorelease];
NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];
//p2添加到pool2中
[p2 autorelease];
[pool2 release];
[pool1 release];
-
如何持有对象所有权
-
类方法创建的内存管理
1、Foundation中的类可以通过alloc创建和类方法创建,区别在于内存管理不同
2、类方法创建的对象是加入了自动释放池 -
循环使用
定义:对象A retain 对象B。同时对象B retain对象A
注意: 循环引用会导致两个对象都无法销毁