属性(property)和实例变量

本文主要是解决什么属性和实例变量的区别,什么时候使用属性和实例变量,@synthesize的作用又是什么?

首先我们要先区分属性、实例变量和成员变量

属性是以@property开头的变量声明,@property开头的变量声明既可以在头文件中声明,也可以在实现文件中声明。

1、@property在不同的文件中声明会有什么区别了?

2、@property声明,系统做了什么?

3、为什么经常我们会看到在头文件中声明了@property之后,在实现文件中经常会@synthesize, @synthesize做了什么?

4、访问属性声明有多少种方式?属性对应的实例变量是什么?

成员变量和实例变量:

@interface MyClass: NSObject

{

   int count;

   id data;

   NSString *name;

}

括号中为类成员变量, 成员变量 = 实例变量 + 基本数据类型变量

实例变量是一个类的实例,如NSString *name,id data(这个我自己不太确定,但按逻辑觉得应该是的,id很像指针,那这么说我更是不敢确定了,现在我连id是什么都不是太清楚),基本数据类型指int、float这种基本的数据类型。

成员变量在头文件和在实现文件中声明有什么区别?

首先我们分析@property的作用:

1、@propety在.h文件中声明,作用:

头文件:

@interface 类名

@property 类型 *属性名;

@end


等同于


头文件:

@interface 类名

{

类型  * _属性名;(本身存在或生成与属性对应的成员变量)

}

属性的getter方法声明;

属性的setter方法声明;

@end

实现文件:

@implement 类名

属性getter方法的实现;

属性setter方法的实现;

@end

语言描述:1、@property为属性名生成了对应的实例变量(我推测这个实例变量是私有的)@property在头文件中声明了setter和getter方法,和在实现文件中实现了setter方法和getter方法

问题:1、是不是@property生成的实例变量都是私有的?是生成的私有的。2、@property有公有和私有之分吗?应用没有。3、如果属性生成的实例变量是私有的,那么property的两种访问方式 实例.属性名 和[实例 get属性]实质上都是调用的[实例 get属性]?我猜是的。OC中点的表达式是表示调用getter方法(文章http://www.lxway.com/482926291.htm说的,写的不错),那另一个疑问来了,如果我在覆盖setter和getter方法中,使用.方法,会不会存在循环调用的问题呢?具体逻辑不明而厉,最好不要这么用。

2、@propety在.m文件中声明,作用:

实现文件:

@interface 类名

@property 类型 *属性名;

@end

等同于

实现文件:

@interface 类名

{

类型  * _属性名;(生成与属性对应的成员变量)

}

//不知道这里有没有getter和setter方法的声明,我猜是有的

@end

@implement 类名

属性getter方法的实现;

属性setter方法的实现;

@end

在实现文件中声明的属性是不能被访问到,原因,我的推测:因为我们在导入文件的时候都是导入.h文件(不知道能不能导入.m文件,反正我在导入.m文件之后,编译链接出现了奇葩问题:linker command failed with exit code 1 (use -v to see invocation), ld: 4 duplicate symbols for architecture x86_64),当然在其他文件中就不能访问到在.m文件中声明的属性了。

3、@synthesize的作用,为什么在实际的测试中不用@synthesize系统也会自动实现声明的方法,而网上说@synthesize的作用就是用来实现声明的方法的?

@synthesize实现了属性声明的访问方法。

在Xcode4.5及以后的版本中,可以省略@synthesize,编译器会自动帮你加上get和set的实现方法,并且默认会去访问“_属性名”这个成员变量,如果找不到"_属性名"这个成员变量,会自动生成一个叫做"_属性名"的私有成员变量。(这段话,可以具体参考 简述http://www.jianshu.com/p/bcf734db475c,这篇文章里讲的不错)

这段话,我有以下看法:

1、@property声明情况下,属性所对应的实例变量(属性所对应的实例变量可以使用@synthesize改变对应关系),首先会去成员变量里找,如果没有才会自动生成

2、@systhesize以前主要是用来实现声明的方法的,现在不用@synthesize系统一样会帮你实现声明方法的

3、@systhesize的语法:

现在我只遇到两种,第一种是@synthesize 属性名, 第二种是@synthesize 属性名 = 实例变量,这两种语法我都有些疑惑,暂时我是这样理解的(实际测试也是符合我这种理解的),第一种@synthesize属性名,其对应的实例变量是属性名,第二种属性对应的实例变量就是等于符号右边的实例变量。


关于@property和@synthesize的解释大致都解释清楚了,总结一下:@property声明分为两种情况:头文件和实现文件,头文件会自动声明方法,实现文件声明会不会自动生成声明方法不得而知,但是我猜至少外部是不能访问的。系统会为@property找对应的成员变量,没有对应的成员变量就会生成对应的成员变量,然后自动生成实现方法。暂时我知道的synthesize语句主要可以来将属性和成员变量对应起来。关于属性的访问主要有两种方式 类实例.属性名和[实例 属性],我的推测是类实例.属性名这种形式的访问本质上就是[实例 属性]这种访问形式。


下面让我们看一下成员变量的声明,成员变量的声明可以在头文件和普通文件中:好像有public、private和protected,具体使用是否与C++中的变量权限一致有待研究。

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

推荐阅读更多精彩内容

  • 本文首发于我的个人博客:「程序员充电站」[https://itcharge.cn]文章链接:「传送门」[https...
    ITCharge阅读 5,374评论 11 24
  • 这几个概念往往知道了 过不了多久又忘 可能是因为平时并没有特别需要区分的地方 一般都用属性 某些时候可能会用...
    BernardChina阅读 521评论 0 4
  • 如果时光能够倒退回高三的时候,我不记得那一次我是失恋还是因为高考所带来的压力而烦心。坐在我前面的姑娘在课堂上陪着我...
    箩七阅读 472评论 0 1
  • 为你,千千万万遍——这句在小说里最令人难以忘记的话,又是如何的使千万人的心灵为之震撼? 最早说出这句话的人,也正如...
    灵风Alex阅读 179评论 0 2
  • 也许若干年后, 经历了事业的高潮与低谷, 经历了友情的亲近与疏离, 经历了爱情的甜蜜与悲伤, 看过了很多的生、老、...
    丑闪阅读 212评论 0 0