IOS属性的作用

一、类和对象。


说明:在学习属性前先理清属性跟类和对象的关系。所以先说明一下类和对象。

类:

类是抽象概念,用于抽象描述具有相同属性和行为的某一类对象。比如:人、车等。

对象:

对象是类的实例化,具体描述这个类别中的一个实体。

类是抽象的,不占内存;对象是具体的,占内存。

举例:
“人”是一个类,人的属性有名字、身高、性别、肤色、国籍等等。人的行为有吃饭、睡觉、尿尿等等。但是,在类别里这些都是抽象的,是用来描述“人”这一类对象。
小红是一个对象,她的名字是小红、性别是女,国籍是中国。她的行为是正在睡觉。这些都是具体存在的,这些具体存在描述了小红这个对象

二、属性


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 人心是一个比深渊还要深千倍万倍的无底洞,它所容纳的阴暗、险恶,往往超过了人在自我意识层面所能想象能承受的本身。个体...
    也么哥阅读 850评论 0 6
  • 一个很偶然的机会,搜索到了简书。当时是搜索Markdown语法,然后不经意间找到的。第一次打开的感觉,就是简洁。没...
    改变世界的心阅读 212评论 0 1