历史由来:

接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法。 
但这只是在iOS5之后,苹果推出的一个新机制。看老代码时,经常看到一个大括号里面定义了成员变量,同时用了@property声明,而且还在@implementation中使用@synthesize方法。 
如下:

Demo

 @interface ViewController ()
{
// 1.声明成员变量
NSString *myString;
}
//2.在用@property
@property(nonatomic, copy) NSString *myString;
@end @implementation ViewController
//3.最后在@implementation中用synthesize生成set方法
@synthesize myString;
@end

其实,发生这种状况根本原因是苹果将默认编译器从GCC转换为LLVM(low level virtual machine),才不再需要为属性声明实例变量了。

在没有更改之前,属性的正常写法需要成员变量+ @property + @synthesize 成员变量三个步骤。 
如果我们只写成员变量+ @property:

 @interface GBViewController :UIViewController
{
NSString *myString;
}
@property (nonatomic, strong) NSString *myString;
@end
编译时会报警告:
Autosynthesized property 'myString' will use synthesized instance variable '_myString', not existing instance variable 'myString'

但更换为LLVM之后,编译器在编译过程中发现没有新的实例变量后,就会生成一个下划线开头的实例变量。因此现在我们不必在声明一个实例变量。(注意:==是不必要,不是不可以==) 
当然我们也熟知,@property声明的属性不仅仅默认给我们生成一个_类型的成员变量,同时也会生成setter/getter方法。

.m文件中,编译器也会自动的生成一个实例变量_myString。那么在.m文件中可以直接的使用_myString实例变量,也可以通过属性self.myString.都是一样的。

注意这里的self.myString其实是调用的myString属性的setter/getter方法。这与C++中点的使用是有区别的,C++中的点可以直接访问成员变量(也就是实例变量)。

例如在oc中有如下代码

 @interface MyViewController :UIViewController
{
NSString *name;
}
@end

在这段代码里面只是声明了一个成员变量,并没有setter/getter方法。所以访问成员变量时,可以直接访问name,也可以像C++一样用self->name来访问,但绝对不能用self.name来访问。

  • 扩展:很多人觉得OC中的点语法比较奇怪,实际是OC设计人员有意为之。
  • 点表达式(.)看起来与C语言中的结构体访问以及java语言汇总的对象访问有点类似,如果点表达式出现在等号  左边,调用该属性名称的setter方法。如果点表达式出现在右边,调用该属性名称的getter方法。
  • OC中点表达式(.)其实就是调用对象的settergetter方法的一种快捷方式,self.myString = @"张三";实际就是[self setmyString:@"张三"];

首先我们要明白,@synthesize 生成了setter/getter方法。 
虽然现在直接使用@property时,编译器会自动为你生成以下划线开头的实例变量_myString,不需要自己手动再去写实例变量。而且也不在.m文件中通过@synthesize myString;生成setter/getter方法。但在看老代码的时候,我们依旧可以看到有人使用成员变量+ @synthesize 成员变量的形式。

那么问题来了:

我们能否认为新编译器LLVM下的@property == 老编译器GCC的 成员变量+ @property + @synthesize 成员变量呢?

答案是否定的。 
因为成员变量+ @property + @synthesize 成员变量的形式,编译器不会帮我们生成_成员变量,因此不会操作_成员变量了; 
同时@synthesize 还有一个作用,可以指定与属性对应的实例变量, 
例如@synthesize myString = xxx; 
那么self.myString其实是操作的实例变量xxx,而非_String了。

原文链接:http://blog.csdn.net/u012946824/article/details/51788565

最新文章

  1. LSD-SLAM深入学习(1)-基本介绍与ros下的安装
  2. PHP的加密解密字符串函数
  3. C++primer学习笔记(四)——Chapter 6
  4. SQLServer2008:助您轻松编写T-SQL存储过程(原创)【转】
  5. 路由器开发板上的TTL线连接方法
  6. RxJava漫谈-RxAndroid使用
  7. CocoaPods对于不同Target引入不同的第三方库Podfile的写法
  8. poj2112 Optimal Milking --- 最大流量,二分法
  9. MoveWindow and SetWindowPos
  10. (转)java.util.Scanner应用详解
  11. 如何获取jar包的在执行机上面的路径
  12. js中使用将json数组 转换为json将一个包含对象的数组用以创建一个包含新重新格式化对象的新数组
  13. [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器
  14. The Architecture of Open Source Applications: Berkeley DB
  15. Ubuntu 16 , 从时间服务器更新时间
  16. Will Georgia Tech's $7K online M.S. in computer science program make the grade?
  17. js中获取url后面的参数值
  18. python文本替换
  19. css基础 -文本溢出 text-overflow:ellipsis;
  20. 基于bootstrup3全屏宽度的响应式jQuery幻灯片特效

热门文章

  1. chrome浏览器提取网页视频
  2. boost库常用功能
  3. jvm性能调优常用命令
  4. CNN 防止过拟合的方法
  5. MySQL四-1:数据类型
  6. Python内置函数之sorted()
  7. oracle高性能的SQL语句的写法
  8. 《TomCat与Java Web开发技术详解》(第二版) 第六章节对应CD附带的helloapp无法启动的问题解决
  9. ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs
  10. 第一篇: Ansible 介绍