一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第7天,点击查看活动详情。
Runtime
Runtime即运行时,OC是一个拓展了C加入了面向对象和Smallta变量英语lk式消息传递的动态语言,实现这一点的核心便是Runtime库,这篇文章不去深入分析原理,仅简单粗暴的列出runtime在实际开发中的一些使用示例。
通过Associ缓存的视频在哪at变量是什么意思e为category添加属性
分类添加属性仅是一个声明,要做到存取需要使用runtime的Associa成员变量和局部变量区别te方法关联对象
- 被关联的对象在生命周期内要比对象本身释放晚很多,变量名的命名规则它们会在NSObject -dealloc调用object_dispose()方法中释放。
- 设置关联对象
void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)
- object 被关联的对象
- key 关联key 要求唯一
- value 关联的对象
- policy 缓存策略
- 获取关联对象
id objc_getAssociatedObj缓存的视频在哪ect(id object, const void * key)
- 移除关联对象
void objc_公积金removeAssociatedObjects(id object)
@interface UISlider (CQExtension) /// 左右间距 @property (nonatomic, assign) CGFloat cq_margin; @end @implementation UISlider (CQExtension) // 设置左右间距Setter - (void)setCq_margin:(CGFloat)cq_margin { NSNumber *number = [NSNumber numberWithFloat:cq_margin]; objc_setAssociatedObject(self, "cqMarginKey", number, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } // 获取左右间距Getter - (CGFloat)cq_margin { NSNumber *number = objc_getAssociatedObject(self, "cqMarginKey"); return number ? [number floatValue] : 0.0f; } @end
通过clas缓存视频怎样转入相册s_copyPropertyList获取属性缓存视频怎样转入相册
/// 获取对象所有的属性
- (NSArray <NSDictionary *>*)cq_getPropertylist {
NSMutableArray *arr = [NSMutableArray array];
unsigned int count = 0;
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
for (int i =0; i<count; i++) {
objc_property_t property = propertyList[i];
const char *name = property_getName(property);
NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
[arr addObject:nameStr];
}
free(propertyList);
return [arr copy];
}
/// 获取对象所有的属性
+ (NSArray <NSDictionary *>*)cq_getPropertylistWithObject:(NSObject *)object {
return [object cq_getPropertylist];
}
//获取对象所有属性及属性的值 key(属性)=value(值)
- (NSArray <NSDictionary *>*)cq_getPropertyAndValueList {
NSMutableArray *arr = [NSMutableArray array];
unsigned int count = 0;
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
for (int i =0; i<count; i++) {
objc_property_t property = propertyList[i];
const char *name = property_getName(property);
NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
NSString *value = [self valueForKey:nameStr];
NSDictionary *dic = @{nameStr:value?value:@"-nil-"};
[arr addObject:dic];
}
free(propertyList);
return [arr copy];
}
+ (NSArray <NSDictionary *>*)cq_getPropertyAndValueListWithObject:(NSObject *)object {
return [object cq_getPropertyAndValueList];
}
通过class_copyMethodList获取所有方法
// 获取对象所有的方法 - (NSArray *)cq_getMethodlist { NSMutableArray *arr = [NSMutableArray array]; unsigned int count = 0; Method *methodList = class_copyMethodList([self class], &count); for (int i =0; i<count; i++) { Method method = methodList[i]; SEL sel = method_getName(method); const char *methodName = sel_getName(sel); NSString *methodStr = [[NSString alloc] initWithUTF8String:methodName]; [arr addObject:methodStr]; } free(methodList); return [arr copy]; } /// 获取对象所有的方法 + (NSArray *)cq_getMethodlistWithObject:(NSObject *)object { return [object cq_getMethodlist]; }
通过class_copyIvarList获取所有成员变变量是什么意思量
//获取对象所有的成员变量 - (NSArray *)cq_getIvarlist { NSMutableArray *arr = [NSMutableArray array]; unsigned int count = 0; Ivar *propertyList = class_copyIvarList([self class], &count); for (int i =0; i<count; i++) { Ivar property = propertyList[i]; const char *name = ivar_getName(property); NSString *nameStr = [[NSString alloc] initWithUTF8String:name]; [arr addObject:nameStr]; } free(propertyList); return [arr copy]; } + (NSArray *)cq_getIvarlistWithObject:(NSObject *)object { return [object cq_getIvarlist]; }
实例方法交换
/** 实例方法交换 @param oriCls 原类 @param origSel 原函数 @param altCls 新类 @param altSel 新函数 */ + (BOOL)cq_swizzleMethodOriCls:(Class)oriCls origSel:(SEL)origSel swizzCls:(Class)altCls swizzSel:(SEL)altSel { Method origMethod = class_getInstanceMethod(oriCls, origSel); Method altMethod = class_getInstanceMethod(altCls, altSel); if (!origMethod || !altMethod) { return NO; } BOOL didAddMethod = class_addMethod(oriCls,origSel,method_getImplementation(altMethod),method_getTypeEncoding(altMethod)); if (didAddMethod) { class_replaceMethod(altCls,altSel,method_getImplementation(origMethod),method_getTypeEncoding(origMethod)); } else { method_exchangeImplementations(origMethod, altMethod); } return YES; } /** 实例方法交换 @param cls 需要交换的类 @param origSel 原函数 @param altSel 新函数 */ + (BOOL)cq_swizzleMethod:(Class)cls origSel:(SEL)origSel swizzSel:(SEL)altSel { return [self cq_swizzleMethodOriCls:cls origSel:origSel swizzCls:cls swizzSel:altSel]; } /** 实例方法交换,直接交换本类 @param origSel 原函数 @param altSel 新函数 */ + (BOOL)cq_swizzleMethodOrigSel:(SEL)origSel swizzSel:(SEL)altSel { return [self cq_swizzleMethod:[self class] origSel:origSel swizzSel:altSel]; }
类方法交换
/** 类方法交换 @param cls 原类 @param origSel 原函数 @param altCls 新类 @param altSel 新函数 */ + (BOOL)cq_swizzleClassMethodOriCls:(Class)oriCls origSel:(SEL)origSel swizzCls:(Class)altCls swizzSel:(SEL)altSel { Method origMethod = class_getClassMethod(oriCls, origSel); Method altMethod = class_getClassMethod(altCls, altSel); if (!origMethod || !altMethod) { return NO; } BOOL didAddMethod = class_addMethod(object_getClass(oriCls),origSel,method_getImplementation(altMethod),method_getTypeEncoding(altMethod)); if (didAddMethod) { class_replaceMethod(altCls,altSel,method_getImplementation(origMethod),method_getTypeEncoding(origMethod)); } else { method_exchangeImplementations(origMethod, altMethod); } return YES; } /** 类方法交换 @param cls 需要交换的类 @param origSel 原函数 @param altSel 新函数 */ + (BOOL)cq_swizzleClassMethod:(Class)cls origSel:(SEL)origSel swizzSel:(SEL)altSel { return [self cq_swizzleClassMethodOriCls:cls origSel:origSel swizzCls:cls swizzSel:altSel]; } /** 类方法交换,直接交换本类 @param origSel 原函数 @param altSel 新函数 */ + (BOOL)cq_swizzleClassMethodOrigSel:(SEL)origSel swizzSel:(SEL)altSel { return [self cq_swizzleClassMethod:[self class] origSel:origSel swizzSel:altSel]; }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)