本文主要是解決什么屬性和實例變量的區(qū)別,什么時候使用屬性和實例變量,@synthesize的作用又是什么?
首先我們要先區(qū)分屬性、實例變量和成員變量
屬性是以@property開頭的變量聲明,@property開頭的變量聲明既可以在頭文件中聲明,也可以在實現(xiàn)文件中聲明。
1、@property在不同的文件中聲明會有什么區(qū)別了?
2、@property聲明,系統(tǒng)做了什么?
3、為什么經(jīng)常我們會看到在頭文件中聲明了@property之后,在實現(xiàn)文件中經(jīng)常會@synthesize, @synthesize做了什么?
4、訪問屬性聲明有多少種方式?屬性對應的實例變量是什么?
成員變量和實例變量:
@interface MyClass: NSObject
{
? ?int count;
? ?id data;
? ?NSString *name;
}
括號中為類成員變量, 成員變量 = 實例變量 + 基本數(shù)據(jù)類型變量
實例變量是一個類的實例,如NSString *name,id data(這個我自己不太確定,但按邏輯覺得應該是的,id很像指針,那這么說我更是不敢確定了,現(xiàn)在我連id是什么都不是太清楚),基本數(shù)據(jù)類型指int、float這種基本的數(shù)據(jù)類型。
成員變量在頭文件和在實現(xiàn)文件中聲明有什么區(qū)別?
首先我們分析@property的作用:
1、@propety在.h文件中聲明,作用:
頭文件:
@interface 類名
@property 類型 *屬性名;
@end
等同于
頭文件:
@interface 類名
{
類型 ?* _屬性名;(本身存在或生成與屬性對應的成員變量)
}
屬性的getter方法聲明;
屬性的setter方法聲明;
@end
實現(xiàn)文件:
@implement 類名
屬性getter方法的實現(xiàn);
屬性setter方法的實現(xiàn);
@end
語言描述:1、@property為屬性名生成了對應的實例變量(我推測這個實例變量是私有的)@property在頭文件中聲明了setter和getter方法,和在實現(xiàn)文件中實現(xiàn)了setter方法和getter方法
問題:1、是不是@property生成的實例變量都是私有的?是生成的私有的。2、@property有公有和私有之分嗎?應用沒有。3、如果屬性生成的實例變量是私有的,那么property的兩種訪問方式 實例.屬性名 和[實例 get屬性]實質(zhì)上都是調(diào)用的[實例 get屬性]?我猜是的。OC中點的表達式是表示調(diào)用getter方法(文章http://www.lxway.com/482926291.htm說的,寫的不錯),那另一個疑問來了,如果我在覆蓋setter和getter方法中,使用.方法,會不會存在循環(huán)調(diào)用的問題呢?具體邏輯不明而厲,最好不要這么用。
2、@propety在.m文件中聲明,作用:
實現(xiàn)文件:
@interface 類名
@property 類型 *屬性名;
@end
等同于
實現(xiàn)文件:
@interface 類名
{
類型? * _屬性名;(生成與屬性對應的成員變量)
}
//不知道這里有沒有getter和setter方法的聲明,我猜是有的
@end
@implement 類名
屬性getter方法的實現(xiàn);
屬性setter方法的實現(xiàn);
@end
在實現(xiàn)文件中聲明的屬性是不能被訪問到,原因,我的推測:因為我們在導入文件的時候都是導入.h文件(不知道能不能導入.m文件,反正我在導入.m文件之后,編譯鏈接出現(xiàn)了奇葩問題:linker command failed with exit code 1 (use -v to see invocation), ld: 4 duplicate symbols for architecture x86_64),當然在其他文件中就不能訪問到在.m文件中聲明的屬性了。
3、@synthesize的作用,為什么在實際的測試中不用@synthesize系統(tǒng)也會自動實現(xiàn)聲明的方法,而網(wǎng)上說@synthesize的作用就是用來實現(xiàn)聲明的方法的?
@synthesize實現(xiàn)了屬性聲明的訪問方法。
在Xcode4.5及以后的版本中,可以省略@synthesize,編譯器會自動幫你加上get和set的實現(xiàn)方法,并且默認會去訪問“_屬性名”這個成員變量,如果找不到"_屬性名"這個成員變量,會自動生成一個叫做"_屬性名"的私有成員變量。(這段話,可以具體參考 簡述http://www.itdecent.cn/p/bcf734db475c,這篇文章里講的不錯)
這段話,我有以下看法:
1、@property聲明情況下,屬性所對應的實例變量(屬性所對應的實例變量可以使用@synthesize改變對應關系),首先會去成員變量里找,如果沒有才會自動生成
2、@systhesize以前主要是用來實現(xiàn)聲明的方法的,現(xiàn)在不用@synthesize系統(tǒng)一樣會幫你實現(xiàn)聲明方法的
3、@systhesize的語法:
現(xiàn)在我只遇到兩種,第一種是@synthesize 屬性名, 第二種是@synthesize 屬性名 = 實例變量,這兩種語法我都有些疑惑,暫時我是這樣理解的(實際測試也是符合我這種理解的),第一種@synthesize屬性名,其對應的實例變量是屬性名,第二種屬性對應的實例變量就是等于符號右邊的實例變量。
關于@property和@synthesize的解釋大致都解釋清楚了,總結(jié)一下:@property聲明分為兩種情況:頭文件和實現(xiàn)文件,頭文件會自動聲明方法,實現(xiàn)文件聲明會不會自動生成聲明方法不得而知,但是我猜至少外部是不能訪問的。系統(tǒng)會為@property找對應的成員變量,沒有對應的成員變量就會生成對應的成員變量,然后自動生成實現(xiàn)方法。暫時我知道的synthesize語句主要可以來將屬性和成員變量對應起來。關于屬性的訪問主要有兩種方式 類實例.屬性名和[實例 屬性],我的推測是類實例.屬性名這種形式的訪問本質(zhì)上就是[實例 屬性]這種訪問形式。
下面讓我們看一下成員變量的聲明,成員變量的聲明可以在頭文件和普通文件中:好像有public、private和protected,具體使用是否與C++中的變量權(quán)限一致有待研究。