Objective-C中的协议使用举例

21 篇文章 0 订阅
一、协议 Protocol简介


协议是一种特殊的程序设计结构,用于声明专门被别的类实现的方法.
协议在以下场合非常有用:
声明需要由别的类实现的方法
声明未知类的接口
集中定义一些互相之间没有继承关系的类的相似点


协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承。它类似java中的接口。


可以在协议声明中使用@optional和@required指令来指定协议中的方法是否必须要实现。

如果没有为方法指定任何指令,@required是协议中默认的指令。


二、如何定义和使用一个协议


// 定义一个协议
@protocol SimpleProtocol
      -(void)doSomething:(NSString *)str;   //定义一个方法
@end


//定义一个接口,使用了上面定义的协议
@interface SimpleClass:NSObject  <SimpleProtocol> {
}
@end


//接口实现类
@implementation SimpleClass
-(void) doSomething:(NSString *)str{ 
   NSLog(str);
}
@end


三、xcode中  UIApplicationDelegate 的定义


@protocol UIApplicationDelegate<NSObject>


@optional


- (void)applicationDidFinishLaunching:(UIApplication *)application;

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);


- (void)applicationDidBecomeActive:(UIApplication *)application;

- (void)applicationWillResignActive:(UIApplication *)application;

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2); // no equiv. notification. return NO if the application can't open for some reason


- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;      // try to clean up as much memory as possible. next step is to terminate app

- (void)applicationWillTerminate:(UIApplication *)application;

- (void)applicationSignificantTimeChange:(UIApplication *)application;        // midnight, carrier time update, daylight savings time change


- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;

- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;


- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame;   // in screen coordinates

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;


// one of these will be called after calling -registerForRemoteNotifications

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0);

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0);


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_AVAILABLE_IOS(3_0);

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_AVAILABLE_IOS(4_0);


- (void)applicationDidEnterBackground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);

- (void)applicationWillEnterForeground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);


- (void)applicationProtectedDataWillBecomeUnavailable:(UIApplication *)application NS_AVAILABLE_IOS(4_0);

- (void)applicationProtectedDataDidBecomeAvailable:(UIApplication *)application    NS_AVAILABLE_IOS(4_0);


@property (nonatomic, retain) UIWindow *window NS_AVAILABLE_IOS(5_0);


- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  NS_AVAILABLE_IOS(6_0);


#pragma mark -- State Restoration protocol adopted by UIApplication delegate --


- (UIViewController *) application:(UIApplication *)application viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);

- (BOOL) application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);

- (BOOL) application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);

- (void) application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);

- (void) application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);

@end




四、NSObject 协议

从上面可以看出,UIApplicationDelegate 实现了NSObject协议


@protocol NSObject


- (BOOL)isEqual:(id)object;

- (NSUInteger)hash;


- (Class)superclass;

- (Class)class;

- (id)self;

- (NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;


- (id)performSelector:(SEL)aSelector;

- (id)performSelector:(SEL)aSelector withObject:(id)object;

- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;


- (BOOL)isProxy;


- (BOOL)isKindOfClass:(Class)aClass;

- (BOOL)isMemberOfClass:(Class)aClass;

- (BOOL)conformsToProtocol:(Protocol *)aProtocol;


- (BOOL)respondsToSelector:(SEL)aSelector;


- (id)retain NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

- (oneway void)release NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

- (id)autorelease NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

- (NSUInteger)retainCount NS_AUTOMATED_REFCOUNT_UNAVAILABLE;


- (NSString *)description;

@optional

- (NSString *)debugDescription;


@end




五、NSObject 基础类实现了 NSObject 协议


@interface NSObject <NSObject> {

    Class isa;

}


+ (void)load;


+ (void)initialize;

- (id)init;


+ (id)new;

+ (id)allocWithZone:(NSZone *)zone;

+ (id)alloc;

- (void)dealloc;


- (void)finalize;


- (id)copy;

- (id)mutableCopy;


+ (id)copyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

+ (id)mutableCopyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;


+ (Class)superclass;

+ (Class)class;

+ (BOOL)instancesRespondToSelector:(SEL)aSelector;

+ (BOOL)conformsToProtocol:(Protocol *)protocol;

- (IMP)methodForSelector:(SEL)aSelector;

+ (IMP)instanceMethodForSelector:(SEL)aSelector;

- (void)doesNotRecognizeSelector:(SEL)aSelector;


- (id)forwardingTargetForSelector:(SEL)aSelector NS_AVAILABLE(10_5, 2_0);

- (void)forwardInvocation:(NSInvocation *)anInvocation;

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;


+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector;


- (BOOL)allowsWeakReference NS_UNAVAILABLE;

- (BOOL)retainWeakReference NS_UNAVAILABLE;


+ (NSString *)description;


+ (BOOL)isSubclassOfClass:(Class)aClass;


+ (BOOL)resolveClassMethod:(SEL)sel NS_AVAILABLE(10_5, 2_0);

+ (BOOL)resolveInstanceMethod:(SEL)sel NS_AVAILABLE(10_5, 2_0);


@end





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值