object-c编程tips-给类对象添加属性

此问题来源于网络封装的一个内容,由于保密的问题,我只叙述我业余的一些想法。

基本思想:

网络请求大家应该都会用一个基类的BaseNetWork, 然后由派生类继承于BaseNetWork,并实现一些特殊的方法。 一般标准的流程是传入block, 当网络请求完毕后,通过block回调回来。这里叙述的关键不是如何实现一个网络请求和回调block的相关内容,而是如何取消请求。 一般基类会实现一个cancelNetWork方法,它根据自己的url进行cancel操作。

举例:

我们使用 DerivedNetWork* net = [DerivedNetWork alloc]init]; 在init方法中设置了自身的url,然后调用基类的sendRequest发送请求, 等待网络返回的回调。 如果需要取消请求,难道我们使用[net CancelNetWork];
,这样肯定不好。 毕竟在其他的方法里面不能得到当前的net指针,保存成成员又没有必要。 于是大家会想到应该使用类名进行cancel操作。 即将cancelNetWork定义成类方法,而不是对象方法。 这就引入了一个新的问题, 类方法如何获取到对象的url? 经过苦思冥想,有一天发现了objc_setAssociatedObject方法,又联想到类对象本身也是对象的思路,想到一个解决方案。

方案:

基类NetWork类的实现代码:

#define LSPerson_URL_Key @"LSPerson_URL_Key"

@implementation BaseNetWork

-(void)setUrl:(NSString *)url
{
    objc_setAssociatedObject([self class], LSPerson_URL_Key, url, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
+(void)cancelRequest
{
    NSString* url =  objc_getAssociatedObject([self class], LSPerson_URL_Key);
    NSLog(@"cancelRequestUrl:%@", url);
}
@end

上面基类有一个setUrl方法,供派生类的对象使用设置自身的url, 它将url绑定到self class的类对象上。 然后还有一个cancelRequest类方法,它从当前类对象中读取到url,来进行真正的cancel操作。 通过这种方式,派生类可以使用此类方法进行自由的取消请求操作了。

代码:

<p class="p1">LPStudyRequest* lpReq = [[LPStudyRequest alloc]init];</p><p class="p2"><span class="s1">lpReq.url = </span>@"http://www.baidu.com"<span class="s1">;</span></p><p class="p2"><span class="s1">
</span></p><p class="p4"><span class="s2">//</span>可以看到日志的输出,不同的派生类可以得到不同的<span class="s2">url</span>。再使用此<span class="s2">url</span>传递给<span class="s2">AF</span>进行取消操作。</p><p class="p1">[LPStudyRequest cancelRequest];</p>

总结:

上面是一个基本的给类添加变量的思想。 它在这个取消网络请求里面得到了很好的应用。 我还将它用到防止自身提前释放, 仿C++的静态变量中。

请一定要注意: C++的静态变量和object-c里面用到的单例static是不一样的。 一个是属于类的静态变量,一个是属于全局程序的静态变量。 如果基类定义了静态变量,派生类继承的话, C++的派生类会很好的继承下来, OC的所有的派生类对象公有的是同一个内存, 因此可以考虑使用绑定到类对象中模拟这种情况。

object-c编程tips-给类对象添加属性

时间: 2024-11-06 23:23:59

object-c编程tips-给类对象添加属性的相关文章

(一)Python入门-6面向对象编程:03类对象-类属性-类方法-静态方法

一:类对象 前面讲的类定义格式中,“class 类名:”.实际上,当解释器执行class 语句时, 就会创建一个类对象. [操作] #测试类对象的生成 class Student: pass #空语句 print(type(Student)) print(id(Student)) print(Student) s1 = Student() print(s1) Stu2 = Student s2 = Stu2() print(Stu2) print(s2) 运行结果: <class 'type'>

福利-&gt;KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口)

WPFS数据绑定(要是后台类对象的属性值发生改变,通知在"client界面与之绑定的控件值"也发生改变须要实现INotitypropertyChanged接口) MainWindow.xaml <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="

Observer(__ob__: Observer) 对象添加属性

重点通过这句话给对象添加属性: this.$set(r,'upshow',false); 在data中定义laws来装从接口中请求到数据 data(){ return{ laws:[],//法律依据 } }, _getAttachment(){ getAttachment( {attachment_id: this.attachment_id}, {Authorization: this.access_token} ).then( (res)=>{this.laws = res.content.

prototype为对象添加属性和方法

可以通过prototype来为已经定义好的的"类"添加属性和方法.这里来了解一下prototype的基础知识.prototype是"构造函数"的属性,不是实例的属性. 示例: function HiClass() { this.sayHi = function(){ alert("hi"); } } var obj = new HiClass(); alert(HiClass.prototype);//outputs [object, objec

python 学习笔记7(类/对象的属性)

27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属性中: __dict__ 为字典,键为属性名,值是属性本身. 例子: class bird(object): feather = True # 父类 class chicken(bird): fly = False def __init__(self, age): self.age = age #

给对象添加属性和给对象原型添加属性的区别

举个例子: var object = function(){     this.a = 1;     this.b = 2; } 然后new一个对象 var obj1 = new object(); 给对象obj1加一个属性 obj.c = 3: 但是我再var obj2 = new object();这里的obj2并没有c这个属性; 但是我通过原型的方式加属性c: object.prototype.c = 3: 那么我var obj3 = new object(); obj3就有c这个属性

类对象,属性与局部变量的内存分配

类对象的分配与数组类似 : 对象的引用,局部变量在栈内存中,new出来的东西(包括成员变量)在堆内存中. 一.成员变量: 1 成员变量定义在类中,在整个类中都可以被访问. 2 成员变量分为类成员变量和实例成员变量,实例变量存在于对象所在的堆内存中. 3 成员变量有默认初始化值. 4 成员变量的权限修饰符可以根据需要,选择任意一个 二.局部变量: 1 局部变量只定义在局部范围内,如:方法内,代码块内等. 2 局部变量存在于栈内存中. 3 作用的范围结束,变量空间会自动释放. 4 局部变量没有默认初

VUE关于data对象中数组修改和对象添加属性的响应式问题

数组: 根据VUE官网: 数组修改: 修改数组某个元素的值: Vue.set(this.items, indexOfItem, newValue): this.$set(this.items, indexOfItem, newValue); this.items.splice(indexOfItem, 1, newValue);   修改数组的长度:vm.items.splice(newLength): 对象: 给数组新添加响应式属性: Vue.set(vm.userProfile, 'age'