您的位置:首页 > 移动开发 > IOS开发

iOS基础-属性与成员变量的区别

2016-04-25 05:09 387 查看
比较早期的ios我们为输出口同时声明了属性和底层实例变量

@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,一般情况下,非子类对象无法访问

虽然它的名称与成员变量相同,但不是同一个变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: