【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
1. @Protocal (协议)
@protocal 是Objective-C 中普遍存在的接口定义方式,即在一个类中通过@protocal 中定义接口,在另外的类中实现该接口,这种定义方式夜晨为"delegate"模式。@protocal 声明了可以被其他任何类实现的方法,协议仅仅是定义一个接口,由其他类区负责实现。
"delegate"模式的使用共分为三个步骤:
1)接口声明:创建 一个protocal 文件TestDelegate
@protocal TestDelegate<NSObject>
@required
-(void)doSomething;
2)接口回调:定义一个类A,包含一个遵从此协议的属性CC,并定义一个方法用调用CC的方法,这样当实例化A的对象时,就可以通过delegate回调了。
@interface TestAppDelegate:NSObject
{
id <TestDelegate> delegate;
}
@property (retain) id delegate;
@implementation TestAppDelegate
-(void)doSomethingWithProtocal
{
[self.delegate doSomething];
}
@end
3)借口实现:创建一个类B实现协议<TestDelegate>
@interface TestAppDelegate:NSObject<TestDelegate>
@implementation TestAppDelegate
-(void)doSomething
{
NSLog(@"call protocol method");
}
@end
注意:由于B的对象是A的delegate,则如果B要release了,则应该先将A的delegate置为nil,然后再releaseB的对象。
2. NSNotifications (通知)
Notifications 是 iOS 提供的一种“同步的”消息通知机制,即消息在发送到下一个接收者之前需要前一个接收者快速返回,否则就是阻塞下一个接收者接收消息,所以对于长时间的消息处理,需要另外启动一个线程来单独处理消息接收后的任务,以确保消息接收到后可以立即返回。
这种消息通知机制可以应用于任意事件和对象,具有广播的性质,消息发送发送者对消息接收者可以一无所知。观察者可以有多个,只要向消息中心注册即可接收其他对象发送的消息,当不需要接收消息时,需要向消息中心注销。
这种消息广播机制时典型的“Observer”模式,应用这种模式需要5个步骤。
1)定义消息
//A.h extern NSString * const NOTIFICATION_STR;
//A.m NSString * const NOTIFICATION_STR = @"notificationStr";
或者在 工程的 myObjective-Prefix.pch 文件中定义
#define NOTIFICATION_STR @"notificationStr"
2)发送消息
// A.m
[[NSNOtificationCenter defaultCenter] postNotificationName: NOTIFICATION_STR object:nil];
注意:这里的object 可以是你定义的一个对象,可以用来传值给消息接收者
还有另外两种发送方式:
[[NSNotificationCenter defaultCenter]postNotification:(NSNotification *)];
[[NSNotificationCenter defaultCenter]postNotificationName:(NSString *) object:(id) userInfo:(NSDictionary *)];
3)观察者注册
//B.m [[NSNOtificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:NOTIFICATION_STR object:nil];
4)观察者处理消息
//B.m -(void)doSomething:(NSNotification *)notify
{
id obj = [notify object];
.........
}
5)观察者注销
// B.m [[NSNOtificationCenter defaultCenter] removeObserver:self];
3. categories
Objective-C 并没有真正的似有方法,但是可以通过 Categories 编写私有方法和变量,使他们不暴露给使用者。这也可称作以静态库的形式将代码进行封装。使用有三个步骤:
1)定义私有Categories
//SomeClass + hidden.h
@interface SomeClass (hidden)
+(void)hiddenMethod;
-(void)hiddenInstanceMethod;
2)实现私有Categories
//SomeClass + hidden.m
+(void)hiddenMethod{........}
-(void)hiddenInstanceMethod{........}
3)主类调用私有方法
// SomeClass.m
@implemetation SomeClass
-(void)doSomeThing
{
[self hiddenMethod];
[instance hiddenInstanceMethod];
}
附:其实常用的很多OC对象的方法都是 定义在 categories中的,如NSString除了 length 和 getCharaterAtIndex: 外基本上都是定义在categories中的。 NSData也一样 等。
4. @protocal 封装类
在Obj-c中 categories 中同样可以实现 @protocal 定义的接口。这样就可以为接口提供封装类,在封装类中实现接口定义的功能,类扩展实现接口的语法。需要三个步骤:
1)定义接口protocal
@protocal SomeDelgate<NSObject>
-(void)doSomething;
2)定义类 和 遵从SomeDelegate协议的扩展类
//SomeClass.h
@interface SomeClass:NSObject
@property (nonatomic,assign) id <SomeDelegate> delegate;
//SomeClass + CategoriesClass.h
#import SomeClass.h
@interface SomeClass(CategoriesClass) <SomeDelegate>
//SomeClass + CategoriesClass.m
@implemetation SomeClass(CategoriesClass)
-(void)doSomething
{
NSLog(@"categories implement protocolMethod.");
}
3) 接口调用
// SomeClass.m
@implemetation SomeClass
SomeClass *obj = [[SomeClass alloc]init];
[obj doSomething];
来源:oschina
链接:https://my.oschina.net/u/818427/blog/201293