1. @Protocal (協議)post
@protocal 是Objective-C 中廣泛存在的接口定義方式,即在一個類中經過@protocal 中定義接口,在另外的類中實現該接口,這種定義方式夜晨爲"delegate"模式。@protocal 聲明瞭能夠被其餘任何類實現的方法,協議僅僅是定義一個接口,由其餘類區負責實現。
ui
"delegate"模式的使用共分爲三個步驟:
atom
1)接口聲明:建立 一個protocal 文件TestDelegatespa
@protocal TestDelegate<NSObject>
.net
@required
線程
-(void)doSomething;
server
@end 對象
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];