IOS开发入门之iOS中属性与成员变量的区别
凌雪 2018-11-09 来源 :网络 阅读 1086 评论 0

摘要:本文将带你了解IOS开发入门iOS中属性与成员变量的区别,希望本文对大家学IOS有所帮助。

本文将带你了解IOS开发入门iOS中属性与成员变量的区别,希望本文对大家学IOS有所帮助。


         

iOS中属性与成员变量的区别。

一、类Class中的属性property

  在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:


   

@interface MyViewController   :UIViewController

{

    UIButton   *myButton;

}

@property (nonatomic, retain) UIButton   *myButton;

@end

   

  最近,苹果将默认编译器从GCC转换为LLVM(low   level virtual machine),从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为输出口声明实例变量。

  例如:MyViewController.h文件


   

@interface MyViewController :UIViewController

@property (nonatomic, retain) UIButton   *myButton;

@end

   

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

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

  例如在oc中有如下代码

  .h文件


   

@interface MyViewController   :UIViewController

{

    NSString   *name;

}

@end

   

  .m文件中,self.name   这样的表达式是错误的。xcode会提示你使用->,改成self->name就可以了。因为oc中点表达式是表示调用方法,而上面的代码中没有name这个方法。

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

  所以在oc中点表达式其实就是调用对象的setter和getter方法的一种快捷方式,例如:dealie.blah   = greeble 完全等价于 [dealie.blah   setBlah:greeble];

  以前的用法,声明属性跟与之对应的实例变量:


   

@interface MyViewController   :UIViewControlle

{

    UIButton   *myButton;

}

@property (nonatomic, retain) UIButton *myButton;

@end

   

  这种方法基本上使用最多,现在大部分也是在使用,因为很多开源的代码都是这种方式。但是ios5更新之后,苹果是建议以以下的方式来使用:


   

@interface MyViewController :UIViewController

@property (nonatomic, retain) UIButton   *myButton;

@end

   

  因为编译器会自动为你生成以下划线开头的实例变量_myButton,不需要自己手动再去写实例变量。而且也不需要在.m文件中写@synthesizemyButton;也会自动为你生成setter,getter方法。@synthesize的作用就是让编译器为你自动生成setter与getter方法。

  @synthesize还有一个作用,可以指定与属性对应的实例变量,例如@synthesize   myButton =   xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。

  在实际的项目中,我们一般这么写.m文件


   

@synthesize myButton;

   

  这样写了之后,那么编译器会自动生成myButton的实例变量,以及相应的getter和setter方法。注意:_myButton这个实例变量是不存在的,因为自动生成的实例变量为myButton而不是_myButton,所以现在@synthesize的作用就相当于指定实例变量;

  如果.m文件中写了@synthesizemyButton;那么生成的实例变量就是myButton;如果没写@synthesizemyButton;那么生成的实例变量就是_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方法。

  注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。

成员变量用于类内部,无需与外界接触的变量。

根据成员变量的私有性,为了方便访问,所以就有了属性变量。属性变量的好处就是允许让其他对象访问到该变量。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。

一些建议:
1.如果只是单纯的private变量,最好声明在implementation里.
2.如果是类的public属性,就用property写在.h文件里
3.如果自己内部需要setter和getter来实现一些东西,就在.m文件的类目里用property来声明

.h中的interface的大括号{}之间的实例变量,.m中可以直接使用;

.h中的property变量,.m中需要使用self.propertyVariable的方式使用propertyVariable变量

    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved