使用setter方法和=号进行属性赋值的区别
来源:互联网 发布:篡改监测数据 编辑:程序博客网 时间:2024/06/07 22:46
如果你不使用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属性。
- 使用setter方法和=号进行属性赋值的区别
- 使用setter方法和=号进行属性赋值的区别
- 使用setter方法和=号进行属性赋值的区别
- 使用setter方法和=号进行属性赋值的区别
- scala属性的getter和setter方法
- 同时重写属性的getter/setter方法和readonly的使用
- JavaScript对象中属性的getter和setter方法
- JavaScript对象中属性的getter和setter方法
- Java中gitter、setter方法和public的区别
- Java的setter方法和getter方法的使用
- property属性的setter、getter方法
- 设置属性setter方法
- 【js对象属性的getter和setter】
- js对象属性的getter和setter
- JavaScript对象属性的getter和setter
- 属性getter和setter
- 属性getter和setter
- 【OC学习-8】存取器方法?getter和setter?其实就是赋值和返回值的两种函数
- ASIHTTPRequest系列(二):文件下载
- to support Chinese in Win7 English version
- ASIHTTPRequest系列(三):文件上传
- ASIHTTPRequest系列(四):Cookies
- ASIHTTPRequest和libxml结合,实现边请求边解析
- 使用setter方法和=号进行属性赋值的区别
- 使用extundelete恢复linux ext3 ext4文件系统下由 rm -rf 误删除文件
- 用 grep 恢复误删的文本文件
- Linux rm命令重定义,防止误删文件无法恢复
- QueryString 页面传值方法
- 软件开发究竟是“难”还是“复杂”?
- jsp乱码问题收集
- 游戏开发教程cocos2d-x移植之一
- Vaadin Web应用开发教程(25):UI组件-Slider组件