iOS中的非正式协议是什么?
2021-11-03 本文已影响0人
喔牛慢慢爬
简介:
在IOS2之前是没有引入@protocol
协议的,IOS2之前实现协议主要是通过给NSObject
添加Category
类别扩展的方式。这种方式相对于iOS2之后引入的@protocol
来说就叫做非正式协议。非正式协议都是以NSObject
的Category
的方式实现的。所以所有基于NSObject
的子类都可以使用定义的非正式协议。对于@Protocol
来说编译器会在编译期检查语法错误,而非正式协议则不会检查是否实现。
示例:
NSKeyValueCoding.h
中的NSKeyValueCoding
就是KVC(Key Value Coding)
使用的一个非正式协议
@interface NSObject(NSKeyValueCoding)
@property (class, readonly) BOOL accessInstanceVariablesDirectly;
- (nullable id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (BOOL)validateValue:(inout id _Nullable * _Nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key;
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
- (BOOL)validateValue:(inout id _Nullable * _Nonnull)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError **)outError;
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath;
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
- (nullable id)valueForUndefinedKey:(NSString *)key;
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;
- (void)setNilValueForKey:(NSString *)key;
- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
@end