`

使用setter方法和=号进行属性赋值的区别

 
阅读更多

转自:http://blog.csdn.net/kmyhy/article/details/7708924

 

如果你不使用ARC,那么使用setter方法和=号对属性进行赋值是不同的。

使用=号赋值,属性不会被retain。 比如: bodyText=s;

如果bodyText声明为retain,则你应当自己retain它:

bodyText=[s retain];

当然,在dealloc方法中,你需要release它避免可能的内存泄露:

[bodyTextrelease];

但当你使用setter方法赋值时,并不需要调用retain,例如:[self setBodyText:s];

这是因为bodyText属性已经声明为retain,当你对bodyText属性使用@synthesize语句时,所合成的setter方法中会自动加入适当的retain语句。例如synthesize后的setBodyText:方法很可能是这样的:

bodyText=[stringretain];

当然,如果setter方法不是Synthesize而是你自定义的,则你应该在setter方法中自己retain。否则,你很可能会收到 message sent to deallocated instance错误。

另外,使用.语句对属性赋值,等同于使用setter方法对属性进行赋值,如self.bodyText=s;一句,就等同于[self setBodyText:s] 。

另外,我们在类方法中需要注意两种属性引用的区别,比如:bodyText和self.bodyText。

当我们使用@property语句 @property(retain,nonatomic)NSString* bodyText;声明属性时,实际上SDK会自动为我们声明一个与属性同名的成员变量:NSString* bodyText。

当synthesize之后,我们读取bodyText属性时,会调用 getter方法bodyText,这个getter方法会return这个同名的成员变量。

当对bodyText属性赋值时,会调用setter方法setBodyText,在这个setter方法中,会对成员变量bodyText进行赋值。

因此,在访问bodyText属性时,你可以通过self.bodyText来访问,也可以直接访问成员bodyText。这样,下列语句实际上等效的:

s=self.bodyText; 和 s=bodyText;

[bodyText release]; 和 [self.bodyTextrelease];

只是在赋值时有所不同,因为bodyText=s;实际上只是对成员bodyText进行了赋值操作。而self.bodyText=s;则很可能在赋值的同时进行了retain操作。因为后者调用了setter方法。

默认情况下,SDK自动添加的成员名会和属性名同名。你也可以自己指定与属性对应的成员变量名,这需要在syntheszie语句中进行,如:

@syntheszie bodyText=_bodyText;

其中,我们把属性bodyText的自动成员命名为_bodyText。你可以在类方法中通过成员_bodyText来操控对象的bodyText属性。


分享到:
评论

相关推荐

    通过构造及反射实现类属性赋值

    标题中的“通过构造及反射实现类属性赋值”涉及到的技术是Java的构造函数和反射机制。这两种方法在特定场景下能帮助我们更灵活、更深入地处理对象属性的复制。 首先,构造函数是创建新对象时调用的特殊方法,它可以...

    Java面向对象(基础)- 属性赋值过程、JavaBean和UML类图

    - 属性私有化,提供getter和setter方法进行访问控制。 - 可选:实现Serializable接口以支持序列化。 JavaBean在Java应用程序和Web开发中广泛使用,作为数据传输对象(DTO)或模型对象(MVC架构中的Model)。 三、...

    Laravel开发-setter

    在Laravel框架中,setter是一种常见的方式来处理对象属性的赋值和验证,特别是在与数据库交互时。setter方法允许我们规范化数据输入,进行类型转换,以及执行其他必要的业务逻辑,确保数据的安全性和一致性。本篇...

    java 利用反射机制,获取实体所有属性和方法,并对属性赋值

    在给定的场景中,我们探讨如何使用反射来获取实体类的所有属性和方法,并对具有null值的属性进行赋值。下面将详细介绍这个过程。 首先,我们要创建一个实体类Person,它包含一些基本类型的属性,如id(int型)、...

    KVC底层原理举例代码-Setter方法

    在Objective-C(OC)编程中,Key-Value Coding(KVC)是一种强大的机制,它允许开发者通过键值的方式来访问和修改对象的属性,而无需直接调用getter或setter方法。KVC不仅简化了代码,还提供了对集合操作的便利。本...

    JavaScript中setter和getter方法介绍_.docx

    此外,getter和setter可以与`Object.defineProperty()`方法一起使用,提供更细粒度的属性控制,包括属性是否可枚举、可配置,以及是否为只读等特性。 总的来说,setter和getter是JavaScript中提高数据安全性和功能...

    JavaScript中setter和getter方法介绍

    JavaScript中的setter和getter是对象的存取器属性(Accessor properties),它们允许开发者定义当尝试获取或设置对象属性时触发的方法。这种机制能够帮助实现对属性的封装,防止外界直接访问对象的内部属性,同时...

    Yii框架getter与setter方法功能与用法分析

    为了确保属性是通过getter和setter方法访问的,当属性不存在时,应该使用canGetProperty()和canSetProperty()这两个魔术方法进行检查。 在实际开发中,必须遵循一定的规则和限制来定义属性的getter和setter方法。...

    属性赋值@Value1

    在Java Spring框架中,`@Value`注解是用于注入属性值的一个重要工具,它可以从配置文件、表达式语言(SpEL)或者属性源中获取值,并将其赋值给bean的字段、方法或方法/构造函数参数。这个注解使得程序更加灵活,不...

    js中getter和setter用法实例分析.docx

    在JavaScript中,`getter`和`setter`是面向对象编程的一部分,它们允许你自定义对象属性的读取和写入行为。这两个概念是ES5引入的,为对象提供了更精细的控制,使得开发者可以在访问或修改属性时执行额外的操作。 1...

    spring级联属性赋值的两种方式解析

    本文将介绍 Spring 级联属性赋值的两种方式:利用 setter 方法进行赋值和利用构造方法进行级联赋值。 利用 setter 方法进行赋值 在 Bean 中需要赋值的属性必须要有 setter 方法,同时 Bean 中必须还要有一个无参的...

    c#常规属性和自动实现属性的区别

    C# 中的常规属性和自动实现属性的区别 C# 中的属性是类中的一个成员,它可以是一种简单的数据存储方式,也可以是一个复杂的逻辑处理机制。在本文中,我们将重点讨论 C# 中的常规属性和自动实现属性的区别。 常规...

    ECMAScript5中的对象存取器属性:getter和setter介绍

    ECMAScript 5引入了一种新的特性,即对象存取器属性(Accessor Properties),通过getter和setter方法,我们可以更精细地控制对象属性的读取和设置。这些特性为JavaScript对象的属性提供了更多的灵活性和控制力,...

    GenerateAllSetter

    该插件的主要功能是在一个方法内部快速生成所有属性对应的setter方法,使得在接口数据赋值或模拟数据(mock)时更为便捷。 首先,我们要理解BEAN类在Java编程中的概念。BEAN类通常遵循一定的规范,即具有私有化属性...

    setter-on-constructor-prototype.rar_The Next

    3. **构造函数与原型链**:JavaScript中的每个函数都是一个对象,可以拥有属性和方法。当函数用作构造函数时,它的`prototype`属性会被用来创建新实例的原型。这意味着,任何在构造函数原型上定义的方法或属性,都...

    解决Vue 给mapState中定义的属性赋值报错的问题

    在Vue.js开发中,Vuex作为一个状态管理库,经常被用于...通过以上两种方法,我们可以有效地解决Vue中使用mapState定义的属性赋值时遇到的报错问题。在实际开发中,我们可以根据具体需求和项目情况选择合适的解决方案。

    kotlin中数据类重写setter getter的正确方法

    数据类在创建时,Kotlin编译器会自动为所有主构造器中的属性生成`equals()`, `hashCode()`, `toString()`方法,以及`componentN()`函数(用于解构赋值)和`copy()`方法。然而,由于Kotlin的设计,数据类的`getter`和...

    vue计算属性get和set用法示例

    如果你希望对计算属性`b`进行赋值操作时能够影响到依赖的其他数据属性,那么你可以提供一个setter函数。在上面的示例代码中,当你执行`this.b = 100`时,实际上是调用了`b`的setter函数,并将100作为参数传递给它。...

    C#两个相同属性的类赋值方法

    6. 自定义逻辑:如果属性赋值需要特定的逻辑,例如验证、转换或其他业务规则,这种方法可能无法满足需求,因为它是基于简单的名称匹配。 为了解决这些问题,可以考虑以下优化策略: - 使用AutoMapper库:这是一个...

    Java实现不同的类的属性之间相互赋值

    最后,我们可以使用这个方法来实现属性之间的赋值。 ```java public static void main(String[] args) { ClassTestCopy1 c1 = new ClassTestCopy1(1205030213, "name:xuliugen","password:123456"); ...

Global site tag (gtag.js) - Google Analytics