分类添加属性之关联引用

分类是不能合成属性的,因为合成属性会生成对应的实例变量,而分类是不允许添加实例变量的(实例变量所在内存区域已初始化为不可更改,无法在动态运行时修改之)。

虽然不能增加实例变量,但是添加属性还是可以的,只不过需要自己在分类中实现get和set方法,同时标记属性为动态获取。

其中一种方法叫做关联引用,实现了用存取器来访问属性,当然实际上并没有实例变量,所以本质上只不过是增加了两个方法而已。

首先在.h中声明属性:

#import <UIKit/UIKit.h>

@interface UIViewController (PropertyTest)
@property (nonatomic, copy) NSString *testProperty;
@end

然后在.m中实现:

#import "UIViewController+PropertyTest.h"
#import <objc/runtime.h>

const char kTestProperty;//声明一个唯一地址的key。或用static char <span style="font-family: Arial, Helvetica, sans-serif;">kTestProperty;</span>

@implementation UIViewController (PropertyTest)

@dynamic testProperty;//运行时动态获取

- (void)setTestProperty:(NSString *)testProperty{
    objc_setAssociatedObject(self, &kTestProperty, testProperty, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)testProperty{
    return objc_getAssociatedObject(self, &kTestProperty);
}

@end

然后用代码测试一下:

self.testProperty = @"testProperty";
    self.testProperty = [self.testProperty stringByAppendingString:@"add string"];
    NSLog(@"%@", self.testProperty);

打印如下:

2015-05-17 15:12:36.816 Test_5_17[3508:1209580] testPropertyadd string

可见实现了属性的get和set功能。

时间: 2024-10-03 06:54:21

分类添加属性之关联引用的相关文章

Objective-C 给分类添加“属性”——关联对象

给分类添加"属性" 咱们知道,分类中可以添加方法,却无法添加属性.那咱们有其他的方法来实现吗? 先来看看下面这段代码: @interface UIView (nl_Frame) @property (nonatomic, assign) CGFloat nl_width; @end @implementation UIView (nl_Frame) - (void)setNl_width:(CGFloat)nl_width { CGRect frame = self.frame; fr

快速上手Runtime(二)之给分类添加属性

我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间. Runtime给分类添加属性步骤 1.在分类的.h文件中声明想要定义的属性 2.在分类的.m文件中实现getter和setter方法 3.引入runtime头文件,然后在setter方法中用objc_setAssociatedObject关联对象 比如给N

OC对象给分类添加属性

OC对象中不能给分类添加属性,但是在实际开发中,经常为了更好的性能需要给分类添加属性,那么 添加的属性不能有默认的成员变量,需要我们自己实现set和get方法,要用到运行时 如下: #import <objc/runtime.h> //运行时的关联对象,动态添加属性 const void *URLStringKey = "URLStringKey"; //set方法 - (void)setUrlStr:(NSString *)urlStr { objc_setAssocia

利用runtime给分类添加属性

在分类中利用@property添加属性,只能声明实例变量的存取声明,而没有存取方法的实现,可以利用runtime实现. 在头文件中定义属性 @property (nonatomic, copy)NSString *name; 在.m文件中实现存取方法 static char *key = "name"; - (NSString *)name { // 根据关联的key,获取关联的值. return objc_getAssociatedObject(self, key); } - (vo

通过运行时动态给分类添加属性

#import <UIKit/UIKit.h> /** iOS 开发中,分类默认不允许保存属性 如果在分类中,定义一个属性,需要自己实现 getter & setter 方法,而且没有 _成员变量 如果在自己开发的框架中,希望在分类中动态添加属性,可以通过 OC 运行时的关联对象的功能! 运行时非常重要的一个应用:给分类动态添加属性,结果能够让框架包装的更好,让使用者做出最小的修改! */ @interface UIImageView (WebImage) @property (non

Runtime的实践——给一个类添加属性(关联对象)

相关文章: <Runtime的初步认识--结构体与类> <Runtime的初步认识--消息机制> 一提到给一个类添加点什么,我们有可能首先就想到类别(Category).那么我们就弄一下. 利用 Category 给现有的类添加属性 比如我们要给一个 NSArray 添加一个属性叫做NSString *name. 我们首先新建一个Objective-C文件. File: Name File Type:Category Class:NSArray 然后我们在NSArray+Name.

给分类(Category)添加属性

遇到一个问题,写了一个分类,但原先类的属性不够用.添加一个属性,调用的时候崩溃了,说是找不到getter.setter方法.查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter.setter方法.有没有解决方案呢?有,通过运行时建立关联引用.接下来以添加一个这样的属性为例: @property (nonatomic, copy) NSString *str; 1.引入运行时头文件. #import <objc/runtime.h> 2.在匿名分类或者头文件中添加属性.区别是

iOS Rumtime 之关联引用

关联引用: 允许开发者为任何对象附着键值数据, 很常用的用法是为分类添加属性. 节目预告 1. 简单的关联引用 2. 为UIViewController 添加MBProgressHUD的HUB属性 3. 为UINavigationBar添加一个view属性 来完成动态改变UINavigationBar的外观 官方API是这样的, 下面这篇博客也是围绕这些来展开 // 关联策略枚举值 typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { OB

如何再分类中添加属性

1 #import <UIKit/UIKit.h> 2 3 typedef enum { 4 HMImageDirectionLeft, // 左边 0 5 HMImageDirectionRight,// 右边 1 6 } HMImageDirection; 7 8 9 @interface UIImage (Extension) 10 // x值 11 @property(nonatomic,assign) CGFloat x; 12 // y值 13 @property(nonatomi