類
@interface定義一個(gè)接口文件,表示可以從外部訪問RPoint。用于定義類、實(shí)例變量及類中的方法等定義信息
類內(nèi)的屬性,可以理解成 C 結(jié)構(gòu)內(nèi)的成員(但是類是引用類型,結(jié)構(gòu)是值類型) ,表示狀態(tài)(有什么)。
類內(nèi)的實(shí)例方法, 可以理解成類內(nèi)定義的函數(shù),表示行為(這個(gè)類能做什么)
用-和+區(qū)分實(shí)例方法和類方法
<pre><code>@interface RPoint : NSObject
@property int x; // 屬性
@property int y; // 屬性
-(void)print; // 實(shí)例方法
@end;//和@interface 對應(yīng)出現(xiàn)</pre></code>
如果把類比喻成一個(gè)杯子的話,那么我們手中拿著的實(shí)物杯子就是對象
對象真正的值存儲在堆的內(nèi)存空間上
而實(shí)例的值是直接存儲在棧的內(nèi)存空間上


類型的成員有
1、數(shù)據(jù)成員描述對象狀態(tài)(有什么)
2、函數(shù)成員描述對象行為(能做什么)

實(shí)例變量和屬性變量的區(qū)別:
1)成員變量用于類內(nèi)部,無需與外界接觸的變量。
2)根據(jù)成員變量的私有性,為了方便訪問,所以就有了屬性變量。屬性變量的好處就是允許讓其他對象訪問到該變量。當(dāng)然,你可要設(shè)置只讀或者可寫等,設(shè)置方法也可自定義。所以,屬性變量是用于與其他對象交互的變量。
3).h文件中得interface的大括號{}之間的實(shí)例變量,.m中可以直接使用。
4).h中的property變量,.m文件中需要使用self.propertyVariable的方式使用propertyVariable變量。

默認(rèn)情況下編譯器會為定義propertName自動(dòng)合成:
一個(gè)getter訪問器方法:propertyName
一個(gè)setter訪問器方法:setPropertyName
一個(gè)實(shí)例變量_propertyName
<pre><code>employee.lastName=@"Chen";//[employee
setLastName: @"Chen"]</pre></code>↑調(diào)用了編譯器自動(dòng)合成的setter方法
<pre><code>NSLog(@"Last Name: %@",
employee.lastName);//[employee
lastName]</pre></code>↑調(diào)用了編譯器自動(dòng)合成的getter方法
employee._tempCount=100在類外訪問是錯(cuò)誤的
類外不能訪問實(shí)例變量,只能訪問屬性
實(shí)例變量的生存周期
1.跟隨對象實(shí)例存儲在堆上
2.值類型實(shí)例變量直接“內(nèi)嵌”在對象實(shí)例中。跟隨對象實(shí)例內(nèi)存釋放而被釋放
3.引用類型變量通過指針“引用”對上的引用類型實(shí)例,ARC針對引用類型計(jì)數(shù)管理,自動(dòng)釋放引用計(jì)數(shù)為0的對象。

方法
.h文件定義函數(shù)
.m文件寫函數(shù)體
成員函數(shù)==方法
<pre><code>BLNPoint* origin=[BLNPoint getOriginPoint]; </pre></code>向BLNPoint發(fā)送一個(gè)getOriginPoint的方法
<pre><code>[origin print];</pre></code>向origin 發(fā)送一個(gè)print方法
方法使用用中括號[]來表示
<pre><code>-(void) moveToX:(int)x toY:(int)y
{
self.x=x;
//這個(gè)self表達(dá)了當(dāng)前實(shí)例變量
self.y=y;
}
</pre></code>toX toY是外部參數(shù)名,外部名不一樣時(shí),才算是不一樣的兩個(gè)方法
<pre><code>-(void) moveToX:(int)x toY:(int)y;
</pre></code>編譯器允許不寫第一個(gè)外部參數(shù)名,但是為了培養(yǎng)好的命名習(xí)慣,約定要寫上第一個(gè)外部參數(shù)名
<pre><code>id obj=[[BLNPoint alloc] init];
//
id 可以表示所有的對象類型,實(shí)際表示BLNPoint
[obj moveToX:50 toY:60]; // 但是不能使用屬性obj.x
[obj print]; //JMP obj-> methodLists-> &print </pre></code>可以用id來表示對象的聲明類型,但是不能用來表示實(shí)際類型
<pre><code>-(void) isEqualToPoint: (BLNPoint*) point{
[self print];
[BLNPoint getOriginPoint];
}</pre></code>可以在實(shí)例方法里訪問實(shí)例方法[self print];
可以在實(shí)例方法里訪問類方法[BLNPoint getOriginPoint];,
<pre><code>+(void) isEqualToPoint: (BLNPoint*) point{
[self print]; //這里使用實(shí)例方法是錯(cuò)誤的
}</pre></code>但是不可以在類方法里訪問實(shí)例方法
<pre><code>
+(BLNPoint*) getOriginPoint{
BLNPoint* origin=[[BLNPoint alloc] init];
origin.x=0;
origin.y=0;
return origin;
}
</pre></code>
這里可以用[self x]這里表達(dá)了當(dāng)前類
這個(gè)[self x]和 [BLNPoint x]等價(jià)
在這個(gè)類方法里,self就等于這個(gè)類 BLNPoint
初始化器和析構(gòu)器
alloc用于向系統(tǒng)手動(dòng)申請一塊內(nèi)存空間
init用于初始化這塊內(nèi)存空間
<pre><code>
-(id)initWithName:(NSString*)name
{
return[selfinitWithName:name WithPages:0 WithCategory:@"General"];
}
-(id)initWithName:(NSString*)name WithPages:(int)pages
{
return[selfinitWithName:name WithPages:pages WithCategory:@"General"];
}
-(id)initWithName:(NSString)name WithPages:(int)pages WithCategory:(NSString)category
{
self= [super init];
if(self) {
NSLog(@"Book Object init");
_name = [name copy];
_pages = pages;
_category = [category copy];
}
return self;
}
</pre></code>
在自定義初始化器內(nèi)部,先要調(diào)用父類初始化器[super init];
用if(self) {}判斷指針是否為空,當(dāng)不為空時(shí),在if語句里再初始化類的實(shí)例變量
在初始化器內(nèi)部,絕大部分情況不能使用屬性,要使用實(shí)例變量。
<pre><code>-(id)initWithName:(NSString)name WithPages:(int)pages WithCategory:(NSString)category`</pre></code>??代碼內(nèi)這類被稱為指定實(shí)例初始化器
<pre><code>-(id)initWithName:(NSString*)name WithPages:(int)pages
{
return[self initWithName:name WithPages:pages WithCategory:@"General"];
}</pre></code>??這類被稱為便捷實(shí)例初始化器,只需要在方法體內(nèi)調(diào)用指定初始化器
<pre><code>
+(void)initialize
{
if(self==[Bookclass]){
NSLog(@"Book Class initialize");
}
}
</pre></code>
??類初始化器
<pre><code>-(void)dealloc
{
NSLog(@"Book Object release");
}</pre></code>??實(shí)例析構(gòu)器
自動(dòng)調(diào)用:ARC 對對象屬性的引用技術(shù)減持 ,自動(dòng)將引用數(shù)減1,實(shí)現(xiàn)內(nèi)存釋放。
手工實(shí)現(xiàn),可以在需要的地方 ,手工調(diào)用-(void) dealloc;
自動(dòng)調(diào)用:父類dealloc (在自己運(yùn)行結(jié)束后調(diào)用)
繼承和多態(tài)
繼承:一個(gè)類只能繼承一個(gè)父類
重寫:只要將子類中書寫一個(gè)與父類具有相同的方法名、返回類型和參數(shù),就可以將將父類的方法覆蓋重寫
多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力
<pre><code>
-(id)init
{
self= [superinit];
if(self) {
_length = 10;
_width = 20;
}
return self;
}
</pre></code>這段代碼就是將父類NSObject中的init方法重寫
<pre><code>
-(void)draw
{
NSLog(@"Shape object draw");
}
-(void)move
{
NSLog(@"Shape object move");
[self draw];
}
</pre></code>??子類重寫方法
當(dāng)在繼承了父類Shape的子類Rectangle里,調(diào)用了move方法,move方法內(nèi)調(diào)用的方法draw會使用Rectangle內(nèi)的draw方法,而不會去調(diào)用父類里同名的方法。
當(dāng)繼承了父類后,方法可以直接在.m文件內(nèi)使用,無需再.h文件內(nèi)聲明