Object-C 声明属性为什么用下划线

看到很多源代码里面,使用前面带下划线变量,然后在@synthesize 语句中 在用一个不带下划线的变量名。这样做,到底有什么作用?

百度之后发现,使用下划线的变量just 一个实例变量,比如@synthesize name = _name 我们同样可以用 foo 代替 _name,只是一种的代码的规范和编程风格,那个下划线只是为了方便区别全局变量和本地变量,或者防止变量重名。

凡是在头文件里面定义了@property的变量,必定要@synthesize。

 

self.nameVarPtr = [[ObjectName alloc] init]
nameVarPtr = [[ObjectName alloc] init]

上面这2种方法我们都见过,那两种赋值方式的区别何在呢?

self.nameVarPtr=xxx 这种赋值方式等价于调用 [self setnameVarPtr:xxx], 而setnameVarPtr:xxx的方法的实现又是依赖于@property的属性的,比如retain,assign等属性。我们申明xxx时,用的属性修饰符retain。当我们,使用self.xxx时,就使用了编译器为我们生成的setXXX方法。在该方法中的retainCount会被加1。

nameVarPtr = xxx 的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。

所以我们要区别好这2种赋值方法:

self调用setter方法的方式
ObjectName*  tmp= [[ObjectName alloc] init];
self.nameVarPtr =tmp;                 //retainCount=2
[tmp release];                               //retainCount=1
指针赋值方式,不会调用setter方法
nameVarPtr= [[ObjectName alloc] init]; // retainCount=1

对某个变量进行赋值操作的时候,尽量要写self.myObj = xxx; 这才是最可靠的方法。

时间: 2024-10-29 19:06:59

Object-C 声明属性为什么用下划线的相关文章

Object-C 声明属性为什么用下划线,代码规范和编程风格

原文:http://blog.sina.com.cn/s/blog_7b9d64af0101923n.html 在阅读和书写关于iPhone编程的代码的时候,发现有很多这样的情况: 看到很多源代码里面,使用前面带下划线变量,然后在@synthesize 语句中 在用一个不带下划线的变量名. 这样做,到底有什么作用? 因为我常常是以这种方式来做的: *.h中申明变量 #import <UIKit/UIKit.h> @interface NewPlayerController : UIViewCo

面对对象之私有属性,以及单、双下划线 | Pythoon

# 在很多程序中会遇到__name,_name的标识符,在类中,如果属性带有双 # 下划线,表示私有属性,通俗的讲,就是不能在类命名空间外被直接调用,但是 # 可以通过方法来调用. # 其实这种表述并不明确,为什么不能被外部直接调用? # 因为,在类被定义的时候,带有双下滑线的属性,它的名字会自动发生改变: # 样式:_Classname__name # 所以,无法直接通过obj.__name访问到值;# 作用:防止子类创建的对象与基类创建的对象出现命名空间冲突的问题; # 单下划线,其实这种标

在数据库字段(实体类属性名)带下划线时get和set方法无效

错误描述: 使用springboot和mybatis,查询数据并封装到java类中,因为java实体类的属性名带有下划线(" _ "),导致get和set方法无效,数据无法封装到实体类中,出现null. 结局办法: 数据库字段保持不变的情况下,改变属性名命名方式,用@Column("")注解将属性名和字段对应. 原文地址:https://www.cnblogs.com/FanWenSong/p/12103320.html

网页中添加下划线的方法汇总及优缺点

本文主要介绍了添加下划线样式的几乎所有方法,并且比较了每一种方法的优缺点.没想到之前一直没有注意的下划线还有这么多玄机奥秘! 本文由 nzbin 翻译,艾凌风 校稿.未经许可,禁止转载! 英文出处:css-tricks.com 发表地址:http://web.jobbole.com/89425/ 有很多种添加下划线样式的方法.可能你还记得< Crafting link underlines on Medium >这篇文章.Medium 并没有尝试特殊的方法,只是想创建一个漂亮的看起来正常的下划

私有属性,私有方法,类变量,实例变量,单下划线,双下划线

1.私有属性__age,不能通过实例对象直接调用,而是通过一个方法来调用 class Dog: def __init__(self, new_age): self.__age = new_age def get_age(self): return self.__age wang_cai = Dog(1) result = wang_cai.get_age() print(result) 2.私有方法,通过一个共有方法来调用 class Dog(object):   def __init__(se

【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸的笑.没办法,老老实实修复bug! 来看看今天我遇到的一个问题: 项目中,我将一个简化的H

转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

http://www.bubuko.com/infodetail-382485.html 这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸

UILable显示不同的字体颜色、字体大小、行间距、首行缩进、下划线等属性(NSMutableAttributedString)

案例1:修改文本字体大小.颜色属性 比如文本展示为姓名和性别,但是我们不能排除姓名会很长,所以此刻的lable宽度我们就不能写死,换句话说lable的宽度根据文本的内容来定 我经常用两种方式解决: 1.前面文章已经涉及:lable自适应http://blog.csdn.net/tuwanli125/article/details/51003798 2.就是使用NSMutableAttributedString属性给infoL设置文本 NSString *infoStr = [NSStringst

“layout_”下划线开头的属性

观看幕课网的视频的收获 “layout_”下划线开头的属性都是交给父容器去处理的属性,如: android:layout_width="match_parent" android:layout_height="match_parent" 没有layout_”下划线开头的属性都是本身的属性,如: android:background="#00ff00" android:visibility="gone"