//
// main.m
// Block-rentHouse
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *jack=[[Person alloc]init];
[jack needOneHouse];
}
return 0;
}
//
// Person.h
// Block-rentHouse
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)needOneHouse;
@end
//
// Person.m
// Block-rentHouse
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import "Person.h"
#import "Agency.h"
@implementation Person
-(void)needOneHouse{
Agency *xiaowang=[[Agency alloc]init];
[xiaowang rentHouseWithBlock:^(NSString *results) {
NSLog(@"回调完毕,顾客感觉还不错");
}];
//将定义和实现聚合在一起
}
@end
//
// Agency.h
// Block-rentHouse
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
/* 之前我们的做法
protocol代理 定义id类型对象
发起事情
调用delegeate里某一方法
*/
typedef void(^ComplishBlock)(NSString *results);//回调
@interface Agency : NSObject
-(void)rentHouseWithBlock:(ComplishBlock)block;
//定义个事件,接收个block
@end
//
// Agency.m
// Block-rentHouse
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import "Agency.h"
@interface Agency()
@property (nonatomic,copy)ComplishBlock block;
@end
@implementation Agency
-(void)rentHouseWithBlock:(ComplishBlock)block{
//保存
self.block=block;
NSLog(@"马上出发");
NSLog(@"找到房源");
//回调数据
self.block(@"希尔顿大酒店999号");
}
@end
category类别
一、用类别和继承分别实现添加方法 (www.baidu.com字符串生成)
如图所示的继承:
继承:新建一个类,继承NSString,给这个类添加方法。
类别:在现有类(1.个人创建的2.系统类库)的基础上添加新的方法,不会创建一个新的类*/
//按照一定的格式创建成一个字符串的对象并返回回去 StringWithFormat方法
return [NSString stringWithFormat:@"www.%@.com",keyWord];
//NSString -> 基类 需要在哪个类上面添加新的方法
//URLString -> 类目(别名) 给添加的这套方法取一个名字
//对于东哥所讲的: 类目比继承更强大在于,不必建立新的类,而继承的新类需要alloc init 占用更多内存。
//类方法的话,没有实例化都不占空间。实例化方法的,NSString仍需要allocinit 新的对象
//何来内存多少之说?
//呃呃呃 保留意见
二、一个地方声明多个地方实现(年龄的不同场景)
类别是一种为现有的类添加新方法的方式
利用OC的动态运行时分配机制,category提供了一种比继承更为简洁的方法来对class进行扩展,
在不改变现有类的基础上,同时无需创建现有类的子类,就能实现现有类添加新方法。
可以为任何已经存在的class添加方法,包括那些没有源代码的类。(如某些框架类 NSString)
关于类别的作用:
关于图解一处声明多处实现:(在实际项目中多用此来分配任务(架构师))
在同一个地方Person声明,在其他类.m文件中分散实现。实现了第二个功能(将类的实现分散到多个不同文件或不同框架中,方便代码管理。也可以对框架提供类的扩展)。
例如:
在Person.h文件中
//第一种场景(种类)
@interface Person (Family) //类别Family
- (int)ageInFamily; //需要的时候才实现
@end
在Family.m文件中
@implementation Family
-(void)show{
NSLog(@"ageInFamily:%d",[self ageInFamily]);
}
@end
//实现
@implementation Person (Family)
-(int)ageInFamily{
return 30;
}
@end
在main.m中
Family *f=[Family new];
[f show];
其他同理。
三、类别的前向引用及局限性
@interface Text : NSObject
//-(void)ddd;//警报
@end
@interface Text (TextName)
-(void)doSomething;
//定义一个声明不去实现,也不会报错
@end
//类别也有局限性见图
//我们对类别的常用方式:给已有的类添加新方法
即,1.不能添加实例变量 2.优先级最高可能覆盖