Objective-C 基础(四)
使用协议委托任务
协议是一个声明某些方法及属性并储存在实体文档。(通常延伸档名是.h)
任何实践协议的对象,都必须实践协议提供的方法及属性(可在协议中指定是必须或可选)。
协议就像是一些规范,实践协议的类必须遵守这些规范
#import <Foundation/Foundation.h>
@protocol PersonProtocol <NSObject>
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, unsafe_unretained) NSUInteger age;
@end
协议在默认的情况下,所有声明都是必须实现。
我们也可以用
@required关键字明确指定必须的属性与方法。如果你希望协定的方法是可实践或不需实尖的使用@optional关
键字,就可以简单的设定。
#import <Foundation/Foundation.h>
@protocol PersonProtocol <NSObject>
@optional
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, unsafe_unretained) NSUInteger age;
@required
- (void) breathe;
@end
检测实例或类方法是否有效
respondsToSelector: 是一个实例方法,继承自 NSObject。该方法用于检查一个对象是否实现了给定的方法。这里如要使用 @selector。例如:
if ( [self respondsToSelector:@selector(work)] ) { printf("I am not lazy.\n"); [self work]; }
respondsToSelector是向某类的对象发消息,查询是否支持某个实例方法;
instancesRespondToSelector是向某类本身(类名即可)发消息,查询是否支持某个实例方法.
都是查询是否支持某个实例方法, 只是消息接受者不同.
if ([[self class] instancesRespondToSelector:@selector(findWork)]) { printf("I can find a job without the help of my mother\n"); }
确认类是否可在运行期使用
你正在使用最新版的SDK,但是你无法确定是否可以使用,因为无法肯定用户是否有安装最新版的
SDK
使用NSClassFronString函数。传入类的名称字符串符。若是返回值为空(nil),则表示这个类无法在这台装
置上使用;反之,这个类则可照你希望的在这台装置上使用
if (NSClassFromString(@"NSJSONSerialization") != nil){
/* 你可以使用这个类 */
[NSJSONSerialization JSONObjectWithData:... /* 在这传入数据 */
options:... /* 在这传入选项 */
error:...]; /* 这里处理错误 */
} else {
/* 该类不可用 */
}