ios下划线变量:为什么变量前要加下划线才有用?

先看一段代码。

复制代码

  1. appdelegate.h
  2. @property (weak) IBOutlet NSMatrix *StockType;
  3. @property (weak) IBOutlet NSMatrix *market;
  4. appdelegate.m
  5. NSCell *st=[market selectedCell];

编译时,总是提示,找不到market变量,但是StockType却没问题。 
如果根据系统建议,在market前加上下划线,变成_market却可以正常编译和执行。 
 
但是到底是为什么呢? 
 
经过对比我发现,在m文件中还有这么一段。

复制代码

  1. appdelegate.m
  2. @synthesize StockType;

差异就在这里,只有在synthesize后面加上market,就不用再用下划线了。 
虽然原因还是不清楚,但是至少问题解决了。

A:

Xcode的编译期自动补全造成的 
 
在.m实现文件中,如果使用property,必须使用 self.property 的方式调用 getter 方法,而如果想要直接实例变量,必须在 m  文件中通过 synthesize 关键字同步过来 
 
所以在早期的 xcode 中(我记得应该是4之前),在.m文件中,必须手写 @synthesize 属性名 = 实例变量名 的方式,将所有属性同步 
而按照oc 的官方命名约定,为了避免变量泄漏,实例变量名一般都建议使用下划线前缀表示法,也就是如果property名称叫 abc,对应的实例变量名就定义为 _abc 
因此在.m代码中所有的property都需要手动按照 @synthesize property = _property 的方式与实例变量同步 
 
这样的写法是如此普遍,以至于xcode4 之后,编辑器添加了自动同步补全功能,只需要在 h 文件中定义 property,在编译期m文件会自动补全出 @synthesize property = _property 的代码,不再需要手写,避免了“体力代码”的手动编码 
 
但是这样要求实例变量名一定等于 "_"+属性名又不太灵活, 如果开发人员需要指定不同的属性名,就需要在 .m 文件中手动编写 @synthesize 了 
 
你的例子中, 
 
如果m中什么都不写 
xcode会默认在编译期为 market 属性,补全成 @synthesize market = _market,实例变量名为 _market 
 
如果m中指定了 @synthesize market 
xcode会认为你手动指定了实例变量名为 market ,编译期补全成:@synthesize market = market,实例变量名为 market 
 
 
很容易验证,你在m中定义为 @synthesize market = _xyz,你在.m文件中使用的实例变量名就是 _xyz 了

时间: 2024-11-03 21:36:05

ios下划线变量:为什么变量前要加下划线才有用?的相关文章

iOS初学,关于变量加下划线问题

为什么做ios开发,变量前要加下划线才有用? 看到这个哥们的解释后,终于明白了,转帖到此. 链接在此:http://www.cocoachina.com/bbs/read.php?tid=234290 在.m实现文件中,如果使用property,必须使用 self.property 的方式调用 getter 方法.顺便说一句,其实self.property其实就是调用了getter方法. oc语法关于点表达式的说明:"点表达式(.)看起来与C语言中的结构体访问以及java语言汇总的对象访问有点类

把骆驼命名法的变量,变为大写字母变小写且之前加下划线

/** * 把骆驼命名法的变量,变为大写字母变小写且之前加下划线 * * @param str * @return */ public static String toUnderline(String str) { str = StringUtils.uncapitalize(str); char[] letters = str.toCharArray(); StringBuilder sb = new StringBuilder(); for (char letter : letters) {

python下划线,私有变量

转自:http://blog.sina.com.cn/s/blog_58649eb30100g4zo.html Python用下划线作为变量前缀和后缀指定特殊变量. "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量:不能用“from xxx import *”而导入: "双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据. 以双下划线开头和结尾的代表python里特殊方法专用的标识,如 _

iOS中的成员变量,实例变量,属性变量

在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end 在现在iOS版本中: 苹果将默认编译器从GCC转换为LLVM(low leve

李洪强iOS开发Swift篇—02_变量和常量

李洪强iOS开发Swift篇—02_变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 在实现 RC4加密算法时Objective-C的的性能是Python的127倍,Swift的性能是Python的220倍 有持怀疑态度的国外程序员,也对Objective-C和Swift的性能进行了测试 http://www.splasmata.com/?p=2798 (2)说明 目前的性能不

UNIX下的LD_PRELOAD环境变量

前言 也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久.不过,在这里,我还是想讨论一下这个环境变量.因为这个环境变量所带来的安全问题非常严重,值得所有的Unix下的程序员的注意. 在开始讲述为什么要当心LD_PRELOAD环 境变量之前,请让我先说明一下程序的链接.所谓链接,也就是说编译器找到程序中所引用的函数或全局变量所存在的位置.一般来说,程序的链接分为静态链接和 动态链接,静态链接就是把所有所引用到的函数或变量全部地编译到可执行文件中.动态链接则不会把函数编译到可执行文件

[转载]警惕UNIX下的LD_PRELOAD环境变量

警惕UNIX下的LD_PRELOAD环境变量 陈皓 前言 也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久.不过,在这里,我还是想讨论一下这个环境变量.因为这个环境变量所带来的安全问题非常严重,值得所有的Unix下的程序员的注意. 在开始讲述为什么要当心LD_PRELOAD环 境变量之前,请让我先说明一下程序的链接.所谓链接,也就是说编译器找到程序中所引用的函数或全局变量所存在的位置.一般来说,程序的链接分为静态链接和 动态链接,静态链接就是把所有所引用到的函数或变量全部地编译

嵌入式 Linux下永久生效环境变量bashrc

嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到4个隐藏文件, .bash_history   记录之前输入的命令 .bash_logout    当你退出时执行的命令 .bash_profile    当你登入shell时执行 .bashrc             当你登入shell时执行 请注意后两个的区别:'.bash_profile'只

python以下划线开头的变量名含义

Python核心风格:避免用下划线作为变量名的开始. 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始.一般来讲,变量名_xxx被看作是“私有的”,在模块或类外不可以使用.当变量是私有的时候,用_xxx 来表示变量是很好的习惯.因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格. "单下划线" "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和自类对象自己能访问