ios下划线变量:为什么变量前要加下划线才有用?
先看一段代码。
|
编译时,总是提示,找不到market变量,但是StockType却没问题。
如果根据系统建议,在market前加上下划线,变成_market却可以正常编译和执行。
但是到底是为什么呢?
经过对比我发现,在m文件中还有这么一段。
|
差异就在这里,只有在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 了
ios下划线变量:为什么变量前要加下划线才有用?的更多相关文章
- iOS初学,关于变量加下划线问题
为什么做ios开发,变量前要加下划线才有用? 看到这个哥们的解释后,终于明白了,转帖到此. 链接在此:http://www.cocoachina.com/bbs/read.php?tid=234290 ...
- python变量前的单下划线(私有变量)和双下划线()
1.单下划线 变量前的单下划线表示表面上私有 ,但是其实这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意 ...
- PHP中用下划线开头的变量含义
http://blog.csdn.net/zlking02/article/details/6752256 一个下划线是私有变量以及私有方法两个下划线是PHP内置变量. https://segment ...
- python下划线,私有变量
转自:http://blog.sina.com.cn/s/blog_58649eb30100g4zo.html Python用下划线作为变量前缀和后缀指定特殊变量. "单下划线" ...
- python中的下划线(私有变量)
Python用下划线作为变量前缀和后缀指定特殊变量. - "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量:不能用"from xx ...
- iOS中的成员变量,实例变量,属性变量
在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyV ...
- UNIX下的LD_PRELOAD环境变量
UNIX下的LD_PRELOAD环境变量 也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久.不过,在这里,我还是想讨论一下这个环境变量.因为这个环境变量所带来的安全问题非常严重,值得 ...
- 嵌入式 Linux下永久生效环境变量bashrc
嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...
- 李洪强iOS开发Swift篇---11_变量&常量&元组
李洪强iOS开发Swift篇---11_变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对 ...
随机推荐
- nginx 配置 ThinkPHP Rewrite
server { listen 80; server_name www.funsion.com; root /www/web/funsion; index index.php; location / ...
- Go channel同步
我们可以使用Channel来同步不同goroutines的执行.看下面的代码: package main import "fmt" import "time" ...
- TCP/IP,HTTP,Socket的区别与联系
一 忆往昔,尽是悔恨泪. 在学校的时候学过,网络七层,也知道tcp的三次握手.但因为根本没用在实际开发中,所以逐渐淡忘.现在就再次理解下三个的区别与联系. 二 正题 网络七层: ...
- 点击TableView中某行进入下一级界面(Swift)
TableView这个控件在iOS的开发中非常的常见,他可以较好的展示一个层级结构.这里主要介绍,在点击某个条目的时候,如何进行跳转的下一个界面.以下是官方的关于这个跳转如何去实现,和如何去传递数据的 ...
- Silverlight 调用 aspx 相关文件
private void Button_Click_1(object sender, RoutedEventArgs e) { WebClient wb = new WebClient(); wb.D ...
- Win10无法上网提示缺少一个或者多个网络协议的处理方法
netsh winsock reset Win+x 再按A 输入 netsh winsock reset
- java数据结构和算法------合并排序
package iYou.neugle.sort; public class Merge_sort { public static void MergeSort(double[] array, i ...
- 60.ISE PhysDesignRules ERROR
PhysDesignRules:2100 - Issue with pin connections and/or configuration on block:<U_ila_pro_0/U0/I ...
- [DHCP服务]——DHCP详解
DHCP:(Dynamic Host Configuration Protocol) 动态主机配置协议 1. DHCP是一个局域网的网络协议,采用UDP协议工作 2. DHCP作用 (1)主要应用在大 ...
- Java小应用程序
Java小应用程序: package applet; import java.applet.AudioClip; import java.awt.BorderLayout; import java ...