成员变量和属性的区别

来源:互联网 发布:在淘宝上怎样发链接 编辑:程序博客网 时间:2024/06/08 13:06

随着发展apple公司将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。因为LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,我们不再声明实例变量。
在iOS5之前,属性的正常写法需要成员变量+ @property + @synthesize 成员变量三个步骤。

还有@dynamic 是工程师自己来实现成员变量的存取方法 , @synthesize 是让 Xcode 帮你生成存取方法.

在iOS5之后,苹果推出的一个新机制。看老代码时,经常看到一个大括号里面定义了成员变量,同时用了@property声明,而且还在@implementation中使用@synthesize方法。

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

@property声明的属性默认生成一个_类型的成员变量,同时也会生成setter/getter方法

点表达式(.)看起来与C语言中的结构体访问以及java语言汇总的对象访问有点类似,如果点表达式出现在等号 = 左边,调用该属性名称的setter方法。如果点表达式出现在=右边,调用该属性名称的getter方法。

OC中点表达式(.)其实就是调用对象的setter和getter方法的一种快捷方式,self.myString = @”张三”;实际就是[self setmyString:@”张三”];

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

成员变量、实例变量、属性变量的联系

@interface MyViewController :UIViewController{UIButton *myButton;int count;id data;}@property (nonatomic, strong) UIButton *myButton;@end

  在{ } 中所声明的变量都为成员变量。 所以myButton、count、data都是成员变量。既然如此,实例变量又是什么意思呢?

  实例变量本质上就是成员变量,只是实例是针对类而言,实例是指类的声明。{ }中的myButton就是实例变量。id 是OC特有的类,本质上讲id等同于(void *)。所以id data属于实例变量。

  成员变量用于类内部,无需与外界接触的变量。因为成员变量不会生成set、get方法,所以外界无法与成员变量接触。根据成员变量的私有性,为了方便访问,所以就有了属性变量。属性变量的好处就是允许让其他对象访问到该变量(因为属性创建过程中自动产生了set 和get方法)。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。

  综上所述可知:成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。

  但是,现在大家似乎都不怎么喜欢用成员变量来定义类的变量,都喜欢用属性变量来定义类的变量。把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。

首先来区别一下实例变量、成员变量的区别:

可以看到在接口 @interface 括号里面的统称为”成员变量”,实例变量是成员变量中的一种!
实例变量的英文翻译是 Instance Variable (object-specific storage)
实例的英文翻译为Instance(manifestation of a class) 说的是“类的表现”,说明实例变量应该是由类定义的变量!
除去基本数据类型int float ….等,其他类型的变量都叫做实例变量。

实例变量+基本数据类型变量=成员变量

指向self.myString 与_myString的地址都是一样的.self.myString只是为了外部调用方便

原创粉丝点击