首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何为ivar编写我自己的setter,即:self.ivar = ...?

为ivar编写自定义setter方法的步骤如下:

  1. 首先,在类的声明中定义一个属性ivar,并使用@property装饰器将其声明为属性。例如:
代码语言:python
代码运行次数:0
复制
@property
def ivar(self):
    return self._ivar

@ivar.setter
def ivar(self, value):
    self._ivar = value
  1. 在属性的getter方法中,使用@property装饰器将ivar声明为只读属性,以便在外部访问时只能获取其值,不能直接修改。这样可以确保只能通过自定义的setter方法来修改ivar的值。
  2. 在setter方法中,使用@property装饰器将ivar声明为可写属性,并定义一个与ivar同名的方法。在该方法中,可以对传入的value进行一些处理或验证,然后将其赋值给_ivar。例如:
代码语言:python
代码运行次数:0
复制
@ivar.setter
def ivar(self, value):
    # 对value进行处理或验证
    processed_value = do_something_with_value(value)
    self._ivar = processed_value
  1. 在setter方法中,可以根据需要对value进行一些处理,例如类型转换、范围检查等。处理后的值可以直接赋值给_ivar,或者根据具体情况进行其他操作。
  2. 在其他方法中,可以通过self.ivar来获取ivar的值,而通过self.ivar = value来调用自定义的setter方法来修改ivar的值。

这样,通过自定义的setter方法,可以对ivar的赋值进行一些额外的处理或验证,从而实现更灵活和安全的属性赋值操作。

推荐的腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体产品选择应根据实际需求和情况进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

面经之《招聘一个靠谱iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

如何让自己类用 copy 修饰符?如何重写带 copy 关键字 setter? 若想令自己所写对象具有拷贝功能,则需实现 NSCopying 协议。...这时候有两种选择: 要么第14行:手动创建 ivar 要么第17行:使用@synthesize foo = _foo; ,关联 @property 与 ivar。...类对象中也有一个isa指针指向它元类(meta class),类对象是元类实例。元类内部存放是类方法列表,根元类isa指针指向自己,superclass指针指向NSObject类。...这也就是为什么说“不推荐在 init 方法中使用点语法”,如果想访问实例变量 iVar 应该使用下划线( _iVar ),而非点语法( self.iVar )。...点语法( self.iVar坏处就是子类有可能覆写 setter 。假设 Person 有一个子类叫 ChenPerson,这个子类专门表示那些姓“陈”的人。

1K100
  • iOS理论基础(二)

    @property 本质是什么?ivar、getter、setter 是如何生成并添加到这个类中 @property 本质是什么?...@protocol 和 category 中如何使用 @property 在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,我们使用属性目的,是希望遵守协议对象能实现该属性...@dynamic 告诉编译器:属性 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 属性只需提供 getter 即可)。...实例变量 = 成员变量 = ivar 如果使用了属性的话,那么编译器就会自动编写访问属性所需方法,此过程叫做“自动合成”( auto synthesis)。...类对象中也有一个isa指针指向它元类(meta class),类对象是元类实例。元类内部存放是类方法列表,根元类isa指针指向自己,superclass指针指向NSObject类。

    42510

    iOS_理解“属性”(property)这一概念

    (这一概念已经定型,并且经由“属性”这一特性而成为Objective-C 2.0一部分)开发者可以令编译器自动编写与属性相关存取方法。...二、属性生成: 1、@synthesize: ​ 默认情况下@property是用@synthesize(合成)修饰默认实现:@synthesize name = _name),自动生成 ivar...时,会屏蔽自动生成 重写了父类属性时,会屏蔽自动生成 2、@dynamic: ​ 还有一个修饰符是@dynamic(动态),不需要自动生成(有自己实现或运行时动态绑定),但是如果调用时没有实现,则会crash...(:NSArrayobjectAtIndex:就不是线程安全,需要加锁等确保安全) nonatomic非原子性访问: ​ 就是去掉了atomic为存取方法添加锁,其getter和setter方法不是线程安全...:[weakSelf someMethod]和[strongSelf someMethod]区别,其实上一条已经说明了(但是当那个面试官突然这么问时,脑子没转过来>_<)。

    60120

    成员变量与属性

    成员变量(Ivar)数据结构 在Objective-C中,成员变量Ivar类型,是指向结构体struct objc_ivar指针,在Objc/runtime.h 中查到,如下所示: typedef...本质上,一个属性一定对应一个成员变量,但是属性又不仅仅是一个成员变量,属性还会根据自己对应属性特性定义来对这个成员变量进行一系列封装:提供 Getter/Setter 方法、内存管理策略、线程安全机制等等...(id obj, Ivar ivar),获得对象指定成员变量值。...调用后需要自己 free(); 运行时操作成员变量和属性示例代码 NSString * runtimePropertyGetterIMP(id self, SEL _cmd){ Ivar ivar...Panda; 然后为它动态添加了 Ivar:_runtimeProperty、对应 Property:runtimeProperty、对应 Getter/Setter方法:runtimeProperty

    1.9K70

    Objective-c 知识总结 -- @property

    setter、getter 方法(readwrite、readonly) // 情况 1 readwrite,必须要同时编写 setter、getter 方法 @property (nonatomic...setter 、getter 方法必须要严格按照 存取方法命名要求进行编写setter --> setValueName: getter --> valueName 不然在调用属性存取方法时候..._age); } @end 那个警告明显是说,自动合成实例变量是__age,而不是 _age,所以你应该定义一个 __age 实例变量才对,不然就警告你; 其实这里是间接地证明了,如果你自己定义了相应带下划线实例变量...同样地,添加 @synthesize age = _age; 即可; 当然,它是没有 setter 方法,你也想要有,也可以任性地自己写一个,但是 readonly 为什么不改成 readwrite...C 字符串形式实例变量变量名 */ OBJC_EXPORT const char *ivar_getName(Ivar v) OBJC_AVAILABLE(10.5, 2.0, 9.0

    1.4K31

    神奇Runtime

    所有的元类最终继承一个根元类,根元类isa指针指向本身,形成一个封闭内循环 superclass指向该类父类, 如果该类已经是最顶层根类( NSObject 或 NSProxy),那么 super_class...有趣是根元类超类是NSObject,而isa指向了自己,而NSObject超类为nil,也就是它没有超类。...消息普通转发 7、首先runtime发送methodSignatureForSelector:消息 生成Selector对应方法签名,参数与返回值类型信息。...派生类在被重写 setter 方法实现真正通知机制,就如前面手动实现键值观察那样。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要通知机制。...然后系统将这个对象 isa 指针指向这个新诞生派生类,因此这个对象就成为该派生类对象了,因而在该对象上对 setter 调用就会调用重写 setter,从而激活键值通知机制。

    60920

    Objective-C Runtime:深入理解成员变量与属性

    基础数据结构 成员变量(Ivar)数据结构 在Objective-C中,成员变量Ivar类型,是指向结构体struct objc_ivar指针,在Objc/runtime.h 中查到,如下所示:...typedef struct objc_ivar *Ivar; 结构体struct objc_ivar数据结构如下所示: struct objc_ivar { char *ivar_name...本质上,一个属性一定对应一个成员变量,但是属性又不仅仅是一个成员变量,属性还会根据自己对应属性特性定义来对这个成员变量进行一系列封装:提供 Getter/Setter 方法、内存管理策略、线程安全机制等等...push #pragma clang diagnostic ignored "-Wundeclared-selector" //1、Add property and getter/setter...Panda; 然后为它动态添加了 Ivar:_runtimeProperty、对应 Property:runtimeProperty、对应 Getter/Setter方法:runtimeProperty

    77830

    Runtime系列(二)--Runtime使用场景

    Runtime 理解介绍文章非常多,只想讲讲Runtime 可以用在哪里,而我在项目里哪些地方用到了runtime。多以实际使用过程为主,来介绍runtime使用。...不能添加属性根本原因是不会帮我们自动添加对象实例变量,也不会帮我们生成set 和get方法,虽然set /get 方法可以自己实现,但是没有实例变量来存储数据。 ?...通常来说该属性应该是常量、唯一、在适用范围内用getter和setter访问到,所以通常我们这样写: static char kAssociatedObjectKey; objc_setAssociatedObject...关于Associated Objects使用,有两个为Category扩展功能,使得Category中也能方便添加属性以及相应getter 和setter 例子。...OC 自动生成分类属性方法 一个库--DProperty 4.运行时动态创建一个类 在某控制器中测试写了这么一个方法,来创建一个MyClass 类。项目中并不存在叫MyClass 类文件。

    1.6K42

    精选面试题教你应对高级iOS开发面试官(提供底层进阶规划蓝图)

    撕开让看看引导消息公众号首图.jpg Runloop和线程关系 1....自己对象具备拷贝功能 具体步骤: 1、需声明该类遵从NSCopying 或 NSMutableCopying协议2、实现 NSCopying 协议。...ivar、getter、setter如何生成并添加到这个类中 本质:@property = ivar + getter + setter;(实例变量+getter方法+setter方法)在编译期自动生成...,那么编译器会自动为你加上这两个方法 3、@dynamic告诉编译器∶属性setter 与 getter方法由用户自己实现,不自动生成。...同时重写了setter和getter时,系统就不会生成ivar,使用@synthesize foo =_foo;关联@property 与ivar 重写了只读属性getter 时 使用了@dynamic

    53900

    Objective-C 中接受点符号

    观念转变之前 有两个编码习惯让你们中一些人觉得很奇怪: 对于一个属性,更倾向于通过它 ivar 进行访问。 当然,也没有使用点符号。 有人说,"访问属性时一定要使用 self."。...不同意这种说法,因为如果自定义了 setter 或 getter,就很容易切换。没什么大不了。...但我不知道是,直接操作 ivar 并不会触发 KVO。如果要使用 KVO,类必须使用setter来操作自己属性。因此,直接 ivar 操作实际上阻止了其他人在类上使用 KVO。 这样不好。...如果你要使用课程,不想因为碰巧用某种方式编码,就切断你与编程工具联系。 属性链接了 self. 所以只能 "使用自己setter"。不想用一种样式来设置值,而用另一种样式来获取值。...因此,"使用自己getter "也就顺理成章了。 但我不喜欢 [[self prop] doSomething]; 突然间,明白了 "使用自己属性 "意思,如果采用self.

    10110

    KVO详解及底层实现

    ,能够给类对象添加方法而不需要创建子类),非正式协议方法是可选 正式协议: 一个正式协议声明了类需要实现方法列表,正式协议有自己声明、采用和类型检查语法。...,也是所能想到: 如何动态生成一个类??...知道了原理,能不能自己写一个KVO?? 动态生成一个自己类 既然是动态生成,肯定是利用了苹果runtime机制,通过上面对KVO学习,也了解到了runtime强大之处。...自己动手写一个KVO KVO底层实现还是很复杂,下面只是简单写下实现过程: 因为它是一个非正式协议,给NSObject新建一个Category,NSObject+kvo.h,添加监听方法: .h文件...@表示参数类型,是一个对象 下面在代码中实验,看下我们自己kvo有没有执行: 修改添加监听者方法,改成我们自己 [self.person zj_addObserver:self forKeyPath

    2.3K20

    iOS开发-Runtime详解

    也就是说,有很多类和成员变量在我们编译时是不知道,而在运行时,我们所编写代码会转换成完整的确定代码运行。...将会参考苹果官方 API 文档。 ---- 一些 Runtime 术语数据结构 要想全面了解 Runtime 机制,我们必须先了解 Runtime 一些术语,他们都对应着数据结构。...而根元类父类是 NSObject,isa指向了自己。而 NSObject 没有父类。...类中有一个实例方法:methodForSelector,你可以用它来获取某个方法选择器对应 IMP ,举个例子: void (*setter)(id, SEL, BOOL); int i; setter...如果我们使用关键字 @dynamic 在类实现文件中修饰一个属性,表明我们会为这个属性动态提供存取方法,编译器不会再默认为我们生成这个属性 setter 和 getter 方法了,需要我们自己提供。

    73270

    iOS开发-Runtime详解

    也就是说,有很多类和成员变量在我们编译时是不知道,而在运行时,我们所编写代码会转换成完整的确定代码运行。...将会参考苹果官方 API 文档。 ---- 一些 Runtime 术语数据结构 要想全面了解 Runtime 机制,我们必须先了解 Runtime 一些术语,他们都对应着数据结构。...而根元类父类是 NSObject,isa指向了自己。而 NSObject 没有父类。...类中有一个实例方法:methodForSelector,你可以用它来获取某个方法选择器对应 IMP ,举个例子: void (*setter)(id, SEL, BOOL); int i; setter...如果我们使用关键字 @dynamic 在类实现文件中修饰一个属性,表明我们会为这个属性动态提供存取方法,编译器不会再默认为我们生成这个属性 setter 和 getter 方法了,需要我们自己提供。

    72990

    iOS_Extension、Category、load、initialize

    (所以尽量不起同名方法,除非是故意想覆盖) ​ Category中声明属性,只会生成setter和getter声明,不会实现setter、getter和成员变量 : // MOPerson+Fitness.h...Category有名字,Extension没有 Category声明属性,不会自动生成ivarsetter、getter Extension可以添加实例变量,Category不可以 Extension...分类不是类没有自己isa,只会将自己methodattach到主类,并不会影响到主类IvarList`。 ​...objc_method_list结构体(可以修改另一个指针,*methodLists值来增加成员方法,虽不能扩展methodLists指向内存区域,却可以改变这个内存区域值);Runtime时...可以添加属性,只是系统不会自动为Category中属性实现setter和getter方法;因为不能添加实例变量,所以需要通过runtime动态绑定方式,实现setter和getter方法。

    52700

    KVC原理分析

    曾在项目中做过苹果APNs改造和优化,很多细节点在网上找资料都是一会这样一会儿那样,最后还是通过通读苹果APNs官方文档才明确。...现在就以查找KVC官方文档为例,演示一下如何在苹果官方文档中找到想要内容。...(获取到是NSValue类型,需要自己转成自定义结构体类型) NSValue *laVieValue = [norman valueForKey:@"lavie"]; LavieStruct lavie666...实际上,关于KVC设置与取值过程,在KVC详解(上)中有过详细说明,不过之前文章中有些地方有些遗漏,在这里补充说明下。 ?...上图是之前文章中总结KVC设值流程,其中第一步中setter方法有两个,先走setKey方法,没有的话再走_setKey方法,都没有的话就进入上图中第2步。 ?

    67341

    iOS运行时Runtime应用

    给对象设置关联属性 @param object 需要设置关联属性对象,给哪个对象关联属性 @param key 关联属性对应key,可通过key获取这个属性, @param value 给关联属性设置值...当我们需要持续大量重复调用某个方法时候,会十分有用,具体代码示例如下: void (*setter)(id, SEL, BOOL); int i; setter = (void (*)(id, SEL...基本思路:首先使用Runtime获取Peson对象所有属性,找到nickName,然后使用ivar方法修改其值。...字典数据转模型操作在项目开发中很常见,通常我们会选择第三方YYModel;其实我们也可以自己来实现这一功能,主要思路有两种:KVC、Runtime,总结字典转化模型过程中需要解决问题如下: 字典转模型...与模型属性不匹配问题,id->uid id anotherName = perpertyTypeDic[propertyName]; if(anotherName &

    1.3K20
    领券