一、@interface和 @property 方式声明变量的区别

1.你可以单独在@interface中定义变量,而不用@property定义;也可以只用@property去定义,而不在@interface中定义,当然用了@property去定义,一般要在.m文件中用@synthsize去合成相应的setter,getter方法。否则会得到一个警告。
2.那这两种方式有什么区别呢。
(1)只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的;而用@property声明的变量可以在外部访问。
(2)用了@property去声明的变量,可以使用“self.变量名”的方式去读写变量。而用@interface的方式就不可以。
二、存取器和变量
1.问题:我们在进行iOS开发时,经常会在类的声明部分看见类似于下面的情况:
  @property (strong, nonatomic) UIWindow *window; 
  @synthesize window = _window; 的语句,
  那么,这个window是什么,_ window又是什么?
2.答案和解释:
(1)@synthesize window = _window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
(2)更具体的解释:根据上面语句,编译器生成的存取方法应该是:setWindow和getWindow。但是存取方法操作的变量是_window,实际上操作的变量始终是_window。
(3)根据上面的语句,编译器会自动生成一个_window成员变量。如果现在在@interface中再显示声明一个_window成员变量,实际上效果是一样的。但是如果在@interface中添加一个window成员变量,会同时存在window和_window两个成员变量,其中_window可以被外部访问,而window不能。
(4)如果这样写:@synthesize window;则编译器生成的存取器名称和变量名是一致的,编译器会自动生成window变量,如果此时同时在@interface中添加window成员变量,效果也是一样。
3.通过这个看似是赋值的这样一个操作,我们可以在@synthesize中定义与变量名不相同的getter和setter的命名,借此来向外部隐藏成员变量,防止被不正常使用,规范使用者使用存取器来操作变量。
4.通过以上分析,做一下使用总结:
(1)如果要建立一个私有变量,不对外公开,则将变量声明在@interface中,不写@property和@synthesize。
(2)如果要建立一个公开的变量,则使用@property和@synthesize来声明变量,不用再在@interface中声明变量,因为变量是自动生成的。如果要让变量名和存取器名不一致,以此来隐藏变量,则使用类似@synthesize window = _window;的代码。
5.默认的getter的方法名是和变量名一样的,当我们的变量是一个形容词的时候,比如是否可见,visible,setter方法名为setVisible,getter方法名为visible,而我们希望getter方法名为isVisible,则可以使用下面的方式:@property(nonatomic,getter=isVisible) BOOL visible;同样的也可以设置setter方法名,示例:@property(nonatomic,setter=setVisible:) BOOL visible;
三、在实现文件中声明全局变量
1.示例代码:
@implementation Fraction{
   int  numerator;
   int  denominator;
}
2.类似于在实现文件中声明的方法一样,声明的变量为私有变量。
四、XCode4.5新特性
1.在xcode4.5以前,当我们想为类添加一个新的公开属性,一般都要写@property和@synthesize,但是在Xcodexi4.5之后,synthesize现在会对应property自动生成。
2.默认行为下,对于属性foo,当没有写相应的synthesize的时候,编译器会自动补全synthesize,方式如下:@synthesize foo = _foo。也就是说,默认的变量名是_xxxxx,如果不希望这样,就只能手动写synthesize了,比如:@synthesize foo;

Objective-C成员变量声明方式探究相关推荐

  1. C++ static、const和static const类型成员变量声明及其初始化

    C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...

  2. java 成员变量声明顺序_C++核心准则讨论:按照成员声明的顺序定义和初始化成员变量...

    Discussion: Define and initialize member variables in the order of member declaration 讨论:按照成员声明的顺序定义 ...

  3. SCL语言的数据类型和常量与变量声明方式

    SCL语言的数据类型主要包含以下几类: 1. 基本数据类型: - BOOL:布尔类型,取值为TRUE或FALSE. - INT:整数类型,取值范围为-32768~32767(16位PLC)或-2147 ...

  4. 【C++】38.类成员变量声明为 对象与指针的区别

    在我们平时写代码或阅读代码时,经常会看到,某个类A中需要使用另一个类B的方法.那么下面会看到两种用法: 一种是直接定义一个B类对象. 一种是在类A中定义一个B类指针: 如: // 头文件 std::s ...

  5. 必须声明标量变量 @sum_level。_ES6系列—新的变量声明方式

    在ES5中,变量声明只有var和function以及隐式声明三种,在ES6中则增加了let.const.import和class四种. 1. let 1.1 块级作用域 let声明的变量的作用域是块级 ...

  6. 关于ECMAScript6 的学习01-ES6 的六种变量声明方式===关于常量const

    const 变量声明常量   在声明const 时,必须初始化   否则会出错 const 变量与let 变量类似 作用域同样在{} 的范围内. 也不可以在同一作用域内声明两个同名 const 变量 ...

  7. 变量声明方式:let与var的区别

    let 定义了之后,会检测重复,生命周期适用于当前和子级函数: var 定义了之后,不会检测重复,生命周期仅仅适用于当前逻辑模块: let handleScroll: function(){let s ...

  8. 1.3 Java类的属性:成员变量的定义和声明

    在 Java 中类的成员变量定义了类的属性.例如,一个学生类中一般需要有姓名.性别和年龄等属性,这时就需要定义姓名.性别和年龄 3 个属性.声明成员变量的语法如下: [public|protected ...

  9. java中如何声明班干部,java类成员变量的定义和声明

    在 Java 中类的成员变量定义了类的属性.例如,一个学生类中一般需要有姓名.性别和年龄等属性,这时就需要定义姓名.性别和年龄 3 个属性.声明成员变量的语法如下:[public|protected| ...

最新文章

  1. HTML+CSS布局技巧及兼容问题【阅读季】
  2. 2019年《自然》迎新子刊:机器智能、新陈代谢和综述物理
  3. tdk磁材手册_TDK的铁氧体磁铁(FB系列) - TDK Product Center.PDF
  4. Jupyter 在线python编辑器
  5. 一个基于Node.js的本地快速测试服务器
  6. VC++获取屏幕大小第二篇 物理大小GetDeviceCaps 上
  7. PyTorch深度学习实践07
  8. js 判断数据是否为空
  9. 实话实说:中文自然语言处理的N个真实情况
  10. 计算机网络——链路层之停止等待协议
  11. k8s通过yaml创建pod_Kubernetes根据yaml创建pod的时候8080访问被拒绝报错
  12. vue获取当前月最后一天_只争朝夕,不负韶华——站在2020年第一天,回望2019最后的两个月...
  13. mysql 基础操作一
  14. 1.4 满足和优化指标
  15. j2ee 简单网站搭建:(十一)ckeditor 控件使用入门
  16. linux提取曲线数据软件,曲线图转数据工具软件(Engauge Digitizer)提取文献中的数据...
  17. IDEA 思维导图 ,类UML 图工具插件 plantUML integration
  18. SASS的安装及简单操作
  19. PPT技巧:快速实现照片双重曝光效果
  20. 【愚公系列】2022年11月 uniapp专题-优购电商-搜索页面

热门文章

  1. http协议的状态码400,401,403,404,500,502,503,301,302等常见网页错误代码
  2. 基于jQuery/zepto的单页应用(SPA)搭建方案
  3. 操作文件 -------JavaScrip
  4. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-8底层驱动之RTC
  5. UVAL - 6755 - Swyper Keyboard
  6. 数据库高级知识——查询截取分析(二)
  7. Leetcode--31. 下一个排列
  8. windows c++ 内存映射大文件问题记录
  9. Java多线程编程递增_java多线程编程之简介
  10. python模块导入_Python模块及其导入