zoukankan      html  css  js  c++  java
  • iOS初学,关于变量加下划线问题

    为什么做ios开发,变量前要加下划线才有用?

    看到这个哥们的解释后,终于明白了,转帖到此。 链接在此:http://www.cocoachina.com/bbs/read.php?tid=234290

    在.m实现文件中,如果使用property,必须使用 self.property 的方式调用 getter 方法。顺便说一句,其实self.property其实就是调用了getter方法。

    oc语法关于点表达式的说明:"点表达式(.)看起来与C语言中的结构体访问以及java语言汇总的对象访问有点类似,其实这是oc的设计人员有意为之。如果点表达式出现在等号 = 左边,该属性名称的setter方法将被调用。如果点表达式出现在右边,该属性名称的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 了

  • 相关阅读:
    Leetcode 3. Longest Substring Without Repeating Characters/ 4. Median of Two Sorted Arrays[二分]
    最大流算法思想和理论的简单理解
    数值线性代数实验-共轭梯度法
    运筹学上机实验
    HDU 1542 Atlantis[扫描线]
    数值实验-高斯消元LU分解
    PAT 1143-Lowest Common Ancestor (30) 二叉树还原
    L2-006. 树的遍历
    hdu-3038 How Many Answers Are Wrong[并查集]
    poj-3253 Fence Repair[霍夫曼树]
  • 原文地址:https://www.cnblogs.com/tibit/p/5081096.html
Copyright © 2011-2022 走看看