【iOS 开发基础学习 六】

类目

  • 定义:类目可以为一个现有的类扩展新的方法,扩展的方法会成为原始类的一部分且可以被子类继承
  • 创建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
    注意: 循环引用会导致两个对象都无法销毁

猜你喜欢

转载自blog.csdn.net/sinat_30220049/article/details/106718976