iOS基础-属性与成员变量的区别
2016-04-25 05:09
387 查看
比较早期的ios我们为输出口同时声明了属性和底层实例变量
随着发展apple公司将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。因为LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,我们不再为输出口声明实例变量。
还可以self.myButton调用属性的getter/setter方法
关于成员变量
self.name 是会提示使用 改成self->name 这就是区别(成员变量没有调用方法)
@synthesize 还有一个作用,可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。
在实际的项目中,我们一般这么写.m文件
这样写了之后,那么编译器会自动生成myButton的实例变量,以及相应的getter和setter方法。注意:_myButton这个实例变量是不存在的,因为自动生成的实例变量为myButton而不是_myButton,所以现在@synthesize的作用就相当于指定实例变量;
如果.m文件中写了@synthesize myButton;那么生成的实例变量就是myButton;如果没写@synthesize myButton;那么生成的实例变量就是_myButton。所以跟以前的用法还是有点细微的区别。
二、类别中的属性property
类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。经常会在ios的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。比如在:UINavigationController.h文件中会对UIViewController类进行扩展
这里添加的属性,不会自动生成实例变量,这里添加的属性其实是添加的getter与setter方法。
注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。
局部变量:是根据其生存周期定义的,在源文件中的array1,其生命周期是在以“{ }”为界限的代码块中,
成员变量:是用于一个区域内的临时变量。成员变量,本例中的是实例成员变量,是作用于整个类对象内的。
从生命周期来看,它比局部变量要长一些,但它默认是私有的,其他对象是无法访问到的。因此,一般自定义方法,作为一个接口让其他对象访问这个变量。因此,成员变量用于类内部,无需与外界接触的变量
成员变量默认是protected,一般情况下,非子类对象无法访问
虽然它的名称与成员变量相同,但不是同一个变量。
@interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end
随着发展apple公司将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。因为LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,我们不再为输出口声明实例变量。
@interface MyViewController :UIViewController @property (nonatomic, retain) UIButton *myButton; //系统在编译的时候会自动生成一个带有下划线的_myButton @end
还可以self.myButton调用属性的getter/setter方法
关于成员变量
@interface MyViewController :UIViewController { NSString *name; } @end
self.name 是会提示使用 改成self->name 这就是区别(成员变量没有调用方法)
@synthesize 还有一个作用,可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。
在实际的项目中,我们一般这么写.m文件
@synthesize myButton;
这样写了之后,那么编译器会自动生成myButton的实例变量,以及相应的getter和setter方法。注意:_myButton这个实例变量是不存在的,因为自动生成的实例变量为myButton而不是_myButton,所以现在@synthesize的作用就相当于指定实例变量;
如果.m文件中写了@synthesize myButton;那么生成的实例变量就是myButton;如果没写@synthesize myButton;那么生成的实例变量就是_myButton。所以跟以前的用法还是有点细微的区别。
二、类别中的属性property
类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。经常会在ios的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。比如在:UINavigationController.h文件中会对UIViewController类进行扩展
@interface UIViewController (UINavigationControllerItem) @property(nonatomic,readonly,retain) UINavigationItem *navigationItem; @property(nonatomic) BOOL hidesBottomBarWhenPushed; @property(nonatomic,readonly,retain) UINavigationController *navigationController; @end
这里添加的属性,不会自动生成实例变量,这里添加的属性其实是添加的getter与setter方法。
注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。
如何区别成员变量 属性 局部变量
@interface ViewController : UIViewController { //成员变量 NSArray *array1; } //属性变量 @property (nonatomic,strong) NSArray *array2; @end
- (void)viewDidLoad { [super viewDidLoad]; array1 = [[NSArray alloc] initWithObjects:@"abcde", nil]; array2 = [[NSArray alloc] initWithObjects:@"123abc", nil]; { // 局部变量 NSArray *array1 = [[NSArray alloc] initWithObjects:@"12345", nil]; } NSLog(@"\narray1 : %@\n array2 : %@",array1,array2); }
局部变量:是根据其生存周期定义的,在源文件中的array1,其生命周期是在以“{ }”为界限的代码块中,
成员变量:是用于一个区域内的临时变量。成员变量,本例中的是实例成员变量,是作用于整个类对象内的。
从生命周期来看,它比局部变量要长一些,但它默认是私有的,其他对象是无法访问到的。因此,一般自定义方法,作为一个接口让其他对象访问这个变量。因此,成员变量用于类内部,无需与外界接触的变量
成员变量默认是protected,一般情况下,非子类对象无法访问
虽然它的名称与成员变量相同,但不是同一个变量。
相关文章推荐
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
- iOS开发系列--通知与消息机制
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
- iOS开发系列--视图切换
- iOS学习总结之ARC和非ARC的单例模式实现
- iOS开发需要哪些图片?
- iOS开发系列--无限循环的图片浏览器
- iOS设置声音和震动
- iOS中runtime的简单用法——动态绑定
- iOS纯代码创建按键点击事件与非代码创建按键点击事件的实现
- iOS中将汉字转换为拼音的API
- 进行iOS代码调试之LLDB调试器
- iOS 计算日期间隔天数 —— HERO博客
- iOS查看日志利器 —— socat
- iOS 自定义cell高度(非等高)
- 2016春季 斯坦福大学iOS9开发 公开课上线
- iOS环信集成<1>
- ios开发总结之控制器的生命周期
- iOS自定义控件的封装细节
- IOS 图片水印或者文字