@property和@synthesize的特性
基础回顾:get方法和set方法
定义类成员变量时,可以在@interface中定义,也可以在@implementation中定义:
在@interface中声明,成员变量的状态是受保护的,即“@protected”;
在@implementation中声明,成员变量的状态是私有的,即“@private”
在类的外面,是无法直接访问成员变量的,只有将成员变量修改为@public时,才可以外部访问。
使用@public时,访问成员变量使用“->”,如:
time->hour=;
但使用@public是有风险的(如上面代码中将hour设置为25,实际只有24小时),所以一般访问成员变量都使用get和set方法;
get方法的声明:
-(int)hour; //get方法,命名规则:返回类型即成员变量的类型,方法名是成员变量名
set方法的声明:
-(void)setHour:(int)newHour //set方法,命名规则:返回类型是void,方法名是set+成员变量名字的首字母大写,带一个参数,参数类型位成员变量的类型
get方法的实现:
-(int)hour
{
return hour;
}
set方法的实现:
-(void)setHour:(int)newHour
{
if(newHour>||newHour<) //对不合理的值进行过滤
{
hour=;
}
hour=newHour;
}
使用get方法和set方法之后,就可以使用“.”语法访问成员变量:
time.h=;
“.”语法可以自动调用get方法和set方法,当给成员变量赋值时,自动调用set方法;当获得成员变量时,自动调用get方法;
time.h=; //自动调用set方法赋值
xiaoShi=time.h //自动调用get方法获得time.h的值
在Objective-C中,提供了两个语句,可以自动生成get和set方法:
@property:只能用在@interface中,为成员变量自动生成相应的get和set方法声明
@synthesize:只能用在@implementation中,为成员变量自动生成相应的get和set方法实现
例如:
@property int hour; @synthesize hour;
进阶:@property和@synthesize的特性
1.使用@property和@synthesize后,仍然可以使用setHour:来访问成员变量:
Time *tm=[Time new];
[tm setHour:];
2.使用@property和@synthsize后,虽然自动生成了get和set方法,仍然可以自己重新定义set和get方法,重新定义的方法会覆盖掉自动生成的方法,OC的这个特性为过滤数据和设置某些规则提供了方便。
3.当只使用@property自动生成get和set方法时,@property会自动生成一个名为“_名称”的成员变量:
@property int hour; //自动生成成员变量"_hour"
这时@property自动进行了3个操作:
1)生成一个名为“_hour”的成员变量(4.6版本以后的Xcode)
2)为“_hour”生成相应的get和set方法的声明
3)位“_hour”生成相应的get和set方法的实现
所以,使用@propery后,就可以省略掉“{}”中的成员变量声明,因为它已经自动生成了。
4.@synthesize hour,会寻找实例变量”hour”,如果没有找到,则自动生成一个”hour”成员变量
使用:@synthesize hour=_hour,就可以使“hour”和”_hour”联系起来了,并不再生成“hour”成员变量
5.在set和get方法中,不允许使用“self.”,因为“self.”调用的就是方法本身,会形成死循环。
- 成员变量如果不需要外部访问,则还是按以前的方式用大括号
@property和@synthesize的特性的更多相关文章
- ios中点语法、property跟synthesize用法
一:OC中得点语法 1> 点语法的基本使用: ·使用 对象.成员变量 可以实现设置成员变量值,和获取成员变量的值 2> 点语法的本质 (点语法是Xcode编译器自己帮我们完成的一个 ...
- Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...
- OC开发系列-@property和@synthesize
property和synthesize 创建一个Person类.提供成员属性的_age和_height的setter和getter方法. #import <Foundation/Foundati ...
- Objective-C中的@property和@synthesize用法
@代表“Objective-C”的标志,证明您正在使用Objective-C语言 Objective-C语言关键词,@property与@synthesize配对使用. 功能:让编译好器自动编写一个与 ...
- iOS 详细解释@property和@synthesize关键字
/** 注意:由@property声明的属性 在类方法中通过下划线是获取不到的 必须是通过 对象名.属性 才能获取到!- @property和@synthesize关键字是针对成员变量以及get/se ...
- OC中两个关键字的作用:@property和@synthesize
两个关键字的使用:@property和@synthesize 一.@property关键字这个关键字是OC中能够快速的定义一个属性的方式,而且他可以设置一些值,就可以达到一定的效果,比如引用计数的问题 ...
- OC语法5——@property和@synthesize
@property和@synthesize: 我们回想一下: 在OC中我们定义一个Student类需要两个文件Student.h 和 Student.m. Student.h(声明文件):定义成员变量 ...
- Objective-C基础笔记(2)@property和@synthesize
先贴出使用@property和@synthesize实现的上一篇中的代码,再解释这两个keyword的使用方法和含义,代码例如以下: Person.h文件 #import <Foundation ...
- Objective-c @property和@Synthesize
在Objective-c中,使用@property来标识属性(一般是实例变量).在实现文件中使用@synthesize标识所声明的变量,让系统自动生成设置方法和获取方法. 也就是说@property和 ...
随机推荐
- E2 2014.5.8 更新日志
增加功能 增加报价单功能,可以针对指定客户生成报价单,可以直接生成一个在线地址,直接把地址发给客户在线打开 传统的报价,先生成一个EXCEL,再传给客户,使用E2,这一切都变得简单,你可生成一个在线地 ...
- Java中String,StringBuffer,StringBuilder的区别及其使用
由于笔试面试经常会问到这个问题,所以在这里先把这些问题搞清楚. String:自JDK1.0开始即有,源码中对String的描述: "Strings are constant; their ...
- iOS - PassData
前言 页面传值: 复合传值 单例传值 userDefaults 传值 代理传值 Block/闭包传值 1.复合传值 复合 - 正向传值 1.接收方,头文件中创建可存放传递值的属性变量 2.发送方,包含 ...
- iOS - UIDatePicker
前言 NS_CLASS_AVAILABLE_IOS(2_0) __TVOS_PROHIBITED @interface UIDatePicker : UIControl <NSCoding> ...
- Linux 注意
1. 赋值运算符= 左右之间不能加空格, 其余的都可以加空格, 而这种限制在以下情况, 可以使用空格 let "n = $1" 虽然也是赋值语句, 但是可以使用空格
- Win7_64位使用Mysql Odbc
1.首先不能安装Mysql Odbc 64位,因为我们的Mysql是32位,使用Mysql Odbc 64位连接Mysql 32位,报错:驱动程序与应用程序之间的体系结构不匹配. 2.要安装Mysql ...
- Python学习笔记15—mysql的操作
安装 Python-MySQLdb pip install mysql-Python Python对mysql的操作 建立一个实验数据库demo mysql> create database d ...
- Python学习笔记9—文件
打开文件
- C++—复合类型
内容概要: -创建和使用数组 -创建和使用C-风格字符串 -创建和使用string类字符串 -使用方法getline()和get()读取字符串 -混合输入字符串和数字 -创建和使用结构 -创建和使用共 ...
- Android开发面试经——1.常见人事面试问题
Android开发(29) 版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 做为程序员,我们都是有梦想的人,有时候当我 ...