IOS属性的作用
来源:互联网 发布:浙江丝绸行业贸易数据 编辑:程序博客网 时间:2024/06/05 02:55
一、类和对象。
说明:在学习属性前先理清属性跟类和对象的关系。所以先说明一下类和对象。
类:
类是抽象概念,用于抽象描述具有相同属性和行为的某一类对象。比如:人、车等。
对象:
对象是类的实例化,具体描述这个类别中的一个实体。
类是抽象的,不占内存;对象是具体的,占内存。
举例:
“人”是一个类,人的属性有名字、身高、性别、肤色、国籍等等。人的行为有吃饭、睡觉、尿尿等等。但是,在类别里这些都是抽象的,是用来描述“人”这一类对象。
小红是一个对象,她的名字是小红、性别是女,国籍是中国。她的行为是正在睡觉。这些都是具体存在的,这些具体存在描述了小红这个对象
二、属性
a.引入属性的原因:
编译器遇到关键字@property
会自动为这个属性添加setter/getter
方法,避免了每次手动添加的麻烦。
b.属性与对象、类的关系。
关系:属性是一个类中用来描述对象的抽象概念,一个类可以有很多属性,一个属性可以描述对象的一个特征。
c.属性、实例变量、成员变量之间的关系。
以下面的属性代码举例:
@property (copy, nonatomic) NSString *myTitle;//声明属性
表面关系:
当我们声明一个属性的时候,编译器就会为我们自动生成对应的实例变量_myTitle
,当然,我们也可以通过关键字synthesize
手动生成对应的实例变量myTitle;
。
实质原因:链接
首先要知道属性是OC的一种新的语言机制,声明的属性必须要有相对应的实例变量。
- 在苹果使用LLVM编译器之前,属性的使用方式是:也就是手动声明实例变量,代码如下:
***.h***@interface ViewController : UIViewController{ //属性的实例变量 NSString *myTitle;}//编译器遇到@property会自动声明对应的setter/getter@property (copy, nonatomic) NSString *myTitle;@end***.m***//编译器遇到@synthesize会自动实现setter/getter方法//编译器遇到@synthesize回去访问myTitle的同名变量,如果没找到就报错。@synthesize myTitle;
- 而苹果开始使用LLVM编译器后,编译器就可以自动为属性生成一个名字带下划线的实例变量,详解如下
属性改变步骤:
1.第一版,最早版本
***.h***@interface ViewController : UIViewController{ NSString *myTitle;}//编译器遇到@property会自动声明对应的setter/getter@property (copy, nonatomic) NSString *myTitle;@end***.m***//编译器遇到@synthesize会自动实现setter/getter方法//编译器遇到@synthesize回去访问myTitle的同名变量,如果没找到就报错。@synthesize myTitle;
2.第二版,不需要自己手动声明一个成员变量,关键字@synthesize
会默认去访问myTitle
的同名变量,如果找不到则会自动生成一个
***.h***@interface ViewController : UIViewController@property (copy, nonatomic) NSString *myTitle;@end***.m***/* 1.编译器遇到@synthesize会自动实现setter/getter方法; 2.编译器遇到@synthesize回去访问myTitle的同名变量; 3.如果找不到同名的变量,会自动生成一个私有同名变量myTitle 4.因此现在开始就不用再手动声明一个实例变量了, */@synthesize myTitle;
3.第三版,考虑到变量名和getter的方法名、setter的参数名一样,容易让人误会,引起警告,所以默认给属性生成的同名变量名带下划线。
/* 1.指定_myTitle作为myTitle的实例变量 2.这样我们就可以去使用_myTitle,避免和setter名同名产生误会了 */@synthesize myTitle = _myTitle;
4.第四版,在IOS4.5后,也@synthesize
可以省略了,最终就变成这样了
@property (copy, nonatomic) NSString *myTitle;
如果我们把上面的过程全部显示出来的话,本质如下:
**.h**#import <UIKit/UIKit.h>@interface ViewController : UIViewController{/****被隐藏的代码:***1.这个默认是@synthesize myTitle = _myTitle;生成的2.所以如果我们手动设置@synthesize myTitle,那么我们编译器 生成的变量就是NSString *myTitle,相当于@synthesize myTitle = myTitle, 如果设置@synthesize myTitle = youTitle,那么编译器生成的变量就是NSString *youTitle了 这要注意。*/ NSString *_myTitle;}@property (copy, nonatomic) NSString *myTitle;//***被隐藏的代码***//编译器遇到@property会自动声明setter/getter方法- (void)setMyTitle:(NSString *)myTitle;- (NSString *)myTitle;@end**.m**/****被隐藏的代码***1.@synthesize关键字会自动实现setter/getter的方法2.@synthesize myTitle = _myTitle指明了属性myTitle的实例变量是_myTitle,setter/getter操作的对象就是_myTitle.*/@synthesize myTitle = _myTitle;- (void)viewDidLoad { [super viewDidLoad]; _myTitle = @"123";}//***被隐藏的代码***//由关键字@synthesize自动实现- (NSString *)myTitle{ return _myTitle;}- (void)setMyTitle:(NSString *)myTitle{ _myTitle = myTitle;}
代码说明:
1.编译器遇到关键字@property
,自动声明setter/getter方法。
2.编译器遇到@synthesize
,自动实现setter/getter方法。
3.@synthesize myTitle = _myTitle;
为属性myTitle
生成了一个实例变量_myTitle
,所以我们对属性的操作self.myTitle
实质上都是在操作_myTitle
变量。
所以属性、实例变量和成员变量的关系是:
声明属性的时候编译器自动生成的实例变量,实例变量的本质就是成员变量,self.myTitle
操作属性的时候实质上是在操作成员变量_myTitle(也就是实例变量)。
同时重写setter/getter
的问题:
我们会发现,当我们同时重写setter/getter
时会报错,为什么呢?这是因为当我们同时重写setter/getter
时,编译器自动添加的代码@synthesize myTitle = _myTitle;
失效,就不会自动为我们生成实例变量_myTitle
了,setter/getter
操作的对象就不存在了。所以我们要加上@synthesize myTitle = _myTitle;
,手动指定setter/getter
要操作的实例对象是_my
- IOS属性的作用
- Intent 属性的作用
- 属性关键字的作用
- onload 属性的作用
- fillable属性的作用
- iOS 属性的属性
- cookie的属性和属性的作用
- iOS synchronized的作用
- iOS synchronized的作用
- iOS DSYMs 的作用
- IOS- SDWebImage的作用
- SQL的identity属性作用
- img的alt属性作用
- hibernate constrained属性的作用
- AutoEventWireup 属性的作用(转载)
- display:block;属性的作用
- serialVersionUID 与其 属性的作用
- TableLayout各个属性的作用
- 关于sublimeText安装Emmet遇到的问题
- [乐意黎转载]关于JS 命名和数组的一些记录
- mybatis 批量插入
- MyEclipse2014破解
- vue-router路由
- IOS属性的作用
- Android客制化开关 defaults.xml注释
- 长整数四则运算_双向循环链表
- iOS经典讲解之UITableView 去掉底部多余的行和分割线
- Sublime Text 3 简体中文汉化
- Inno Setup打包之先卸载再安装
- iOS常用的存储方式介绍
- 冒泡排序
- 64-ia-32架构优化手册(3)