點語法
基本使用:
[p setAge = 10];就等價于p.age = 10;
意思就是這兩種寫法都是正確的,而且他們的功能也是一樣的,但是我們的點語法要比我們以前的寫法要方便的多
使用注意:
1、點語法的本質(zhì)是方法的調(diào)用,而不是訪問成員變量,(這和Java有些不同)
2、如何驗證點語法的本質(zhì)是set方法,還是get方法?
凡是賦值的都是我們的set方法,代碼類似于:
上面的一行就是我們set方法的調(diào)用,下面那一行就是我們get方法的調(diào)用
注意點:self.age = age;這樣的代碼會陷入死循環(huán)的。因為這個代表的意思是:將我們的自己的age變量賦值給自己,如果執(zhí)行這一段代碼系統(tǒng)就會不斷地調(diào)用。另外注意即使這個是錯的,但他依舊是我們set方法的調(diào)用
相同于我們上面的self.age = age;我們的return self.age;也是回讓我們的系統(tǒng)陷入死循環(huán)
點語法只是簡單的方法調(diào)用,而不是直接訪問成員變量。
成員變量的作用域
分4種:
圖中黃色部分的類型我們不經(jīng)常使用的
1、@public :在任何地方都能直接訪問對象的成員變量
2、@private:只能在當(dāng)前類的對象方法中直接訪問,意思就是不可以在main函數(shù)中直接訪問(@implementation中創(chuàng)建成員變量默認(rèn)就是@private)
3、@protect:能在當(dāng)前類和子類的對象方法中直接訪問(@interface默認(rèn)就是@protect)
4、@package :只要處于同一個框架中就可以直接訪問對象的成員變量
a、在類的實現(xiàn)中我們可以在成員變量(即是在我們類的.m文件中)但是這個默認(rèn)是私有的
b、我們在@implementation中寫的成員變量名不能與我們再@interface中的成員變量名重復(fù)
使用注意與補(bǔ)充
1、我們的類只能繼承一個父類
2、父類即是超類,只是不同的人的叫法不同 ?英文:superclass
@property與@synthesize
如何讓我們的Xcode幫助我們寫一些成員變量的set方法與get方法?
@property就是幫助我們生成某個成員變量的set方法與get方法的聲明
@synthesize 就會幫助我們直接生成某個成員變量的set方法與get方法的實現(xiàn),并且會使我們直接訪問到我們的成員變量。
第一個age代表著是對我們age這個成員變量的實現(xiàn),后面的_age代表著是訪問我們的成員變量,而不是訪問其他成員變量
是個方法與get方法的最簡寫法:遇到相同類型的成員變我們可以同時寫,只需要我們將其用逗號隔開。
最好的是分開寫。
@property ?age;這行代碼完成了三件事,:
1、給我們的類擴(kuò)充一個成員變量
2、給我們的成員變量進(jìn)行set方法與get方法的聲明與實現(xiàn)
3、給我們的成員變量set方法get方法實現(xiàn)
使用細(xì)節(jié):
補(bǔ)充:id:萬能指針,可以指向任何OC對象 ? ? ?id相當(dāng)于NSObject ?*
構(gòu)造方法
基本概念:
完整的創(chuàng)建一個對象:
1、分配儲存空間 ? ? ? ? 調(diào)用new中的類方法: ?+alloc
2、初始化 ? ? ? ? ? ? ? ? ? ?調(diào)用new中的對象方法 ? -init
構(gòu)造方法就是init方法,構(gòu)造方法:用來初始化對象的方法,是對象方法,以減號開頭
重寫init方法
要求:
做法:
當(dāng)然最簡單的寫法,即是以后的寫法:
重寫構(gòu)造方法的目的:為了讓對象創(chuàng)建出來,成員變量就會有一些固定的值
重寫構(gòu)造方法的注意點:
1、先調(diào)用父類的構(gòu)造方法([super ?init])
2、再進(jìn)行子類內(nèi)部的成員變量的初始化
init方法的執(zhí)行過程
上面的是調(diào)用父類的init方法初始化父類的成員變量,后再調(diào)用子類init方法,將子類的成員變量初始化
自定義構(gòu)造方法
規(guī)范:
1、一定是對象方法,以減號開頭
2、返回值一般是id類型
3、方法名要以initWith開頭
方法的聲明:
方法的實現(xiàn):
方法的調(diào)用:
當(dāng)我們的Student子類需要調(diào)用關(guān)于年齡、學(xué)號、名字的時候(這時候年齡、名字是屬于我們Person這個父類的)由于我們的年齡是private的作用域所以我們不能直接利用以前的方法來
這個時候就需要我們調(diào)用關(guān)于他們的set方法以及get方法。具體的代碼格式如下:
這樣一寫就成功的將我們傳入的內(nèi)容賦值給我們內(nèi)部的成員變量了
但是我們不建議利用上面的方式原因:
麻煩,一旦父類要改子類同樣要改
最簡單的方法(開發(fā)中最常見的方式)就是:
這樣就完成了上上圖中的代碼要完成的工作了
將父類的成員變量傳給父類去初始化,子類的成員變量交給子類去初始化好處:
1、自己的東西自己管,別人的東西不要插手
2、一旦 我們的父類的成員變量名稱發(fā)生改變,子類就不需要插手
注意:if開頭的代碼的作用就是將我們name 、age傳遞到我們父類進(jìn)行初始化