點語法:
person類中有_age乙個成員變數;
設定成員變數_age的值:
person *p = [person new]
p.age = 10;[p setage:10];
獲取成員變數的值:
int a = p.age;[p age];
根據有無賦值判斷是get方法還是set方法
點語法的本質還是方法呼叫(可通過在set和get方法中設定驗證語句驗證)
成員變數作用域:
當類在宣告成員變數時加入@public,那麼在任何地方都可以直接訪問物件的成員變數
當類在宣告成員變數時加入@private,那麼不允許直接訪問類的成員變數只能使用set和get方法(只能在當前類的方法物件方法中直接訪問)
當類在宣告成員變數時加入@protected,那麼只能在當前類和子類的物件方法中直接訪問(預設為protected)
類的成員變數 既可以在.h(宣告檔案)檔案中宣告 也可以在.m(實現檔案)檔案中宣告。但是在.h檔案中宣告預設是protected而在.m檔案中宣告預設是privated型別(也可以通過setter和getter方法訪問)(注意:成員變數名不能與宣告檔案中的成員變數名相同)(原因:其他檔案無法import.m檔案因此其他檔案無法使用該成員變數)
@property int age;相當於生成age的set和get方法;
@synthesize age(方法宣告名) = _age(成員變數名):
自動生成@property宣告 age的setter和getter方法,並且會訪問—_age這個成員變數
也可以同時實現幾個方法
@synthesize age=_age,name=_name;
@synthesize age=_age,name=_name;
執行此句時會訪問_speed這個成員變數,如果不存在,就會自動生成@private型別的_speed變數
缺點:自動生成的型別為private型別
注意:如果寫為:
1、@synthesize age;則會自動生成名字為age(不是_age)的成員變數的set和get方法
2、如果@implementation中已經有了set和get方法 在使用@synthesize時不會自動生成以_下劃線開頭的成員變數
id型別:
萬能指標,能指向\操縱任何oc物件
id d = [person new];//注意id後面沒有*號
相當於nsobjct *o = [person new]; // 多型 id = nsobject*
id 相當於可以指向任何乙個nsobjct的子類,形成類似多型的形式
構造方法:
person *p = [person new];
完整的 建立乙個可用物件
1.分配儲存空間 +allo
2.初始化 -init
1、呼叫+alloc分配儲存空間
person *p = [person alloc];
2、呼叫-init進行初始化
person *p2 = [p1 init];
1+2 = person *p = [person new];
也可以寫為:person *p3 = [[person alloc] init];
以後建立新的物件不要在用new了 改為兩步走
構造方法:用來初始化的方法,是乙個構造方法(-開頭)
重寫構造方法:
例子:重寫init方法
- (id)init
//3、返回乙個已經初始化完畢的物件
return self;
}可以簡寫為
- (id)init
return self;
}總結:
重寫構造方法的目的:
為了讓物件建立出來,成員變數就會有一些固定的值
重寫構造方法的注意點:
1、先呼叫父類的構造方法(self = [super init])
2、在進行子類內部成員變數的初始化
自定義構造方法:
1、一定是物件方法,一定以-開頭
2、返回值一般為id型別
3、方法名一般以init開頭
例子:- (id)initwithname:(nsstring*)name;
- (id)initwithname:(nsstring*)name
return self;
}呼叫:person *p = [[person alloc] initwithname:@"rose"];
寫程式時:能呼叫原來的程式就不要重複寫原來的**!
誰宣告的變數由誰來進行賦值
父類的屬性(成員變數)交給父類來處理,子類方法處理子類自己的屬性(成員變數)
分類(category )(類別、類目):
可以給某個類擴充一些方法(不修改原來的**)
//宣告
@inte***ce 類名[分類名稱]
@end
//實現
@implementation 類名[分類名稱]
@end;
作用:在不改變原來類內容的基礎上 可以為類增加一些方法
使用注意:
1、不能擴充成員變數,只能新增方法
2、新增的分類中可以訪問成員變數
3、可以直接使用物件呼叫分類中的方法 分類-原來的類-父類
4、分類的優先順序最高,物件呼叫方法時優先在分類中查詢,因此如果分類中重寫類中的某個方法,會覆蓋掉原來類中的方法,從而導致原來的方法失效
5、方法呼叫優先順序:分類(最後參與編譯的分類優先)->原來類->父類
類的本質」
類也是乙個物件 是乙個class型別的物件 簡稱類物件
class 型別的定義
typedef struct objc class *class
class 建立 person類物件
利用person類物件 建立person型別的物件
person *p1 = [[person alloc] init];
person *p2 = [[person alloc] init];
//獲取記憶體中的類物件
class c = [p class];
class c2 = [p2 class];
c 與 c2是相同的
因為p1,p2都是person類的物件所以記憶體中的物件類相同
(類物件是否相同可根據物件中的isa的指向進行判斷)
另一種獲取記憶體中類物件的方法
class c3 = [person class];
最終搞得輸出結果 c =c2 = c3;
乙個類在記憶體中只有乙個儲存空間 我們稱其為類物件
類的載入順序:先載入父類 在載入子類
load方法:在類被載入的時候呼叫 只會被載入一次
initialize方法:當程式啟動的時候,會載入一次專案中所有的類,類載入完畢後就會呼叫load方法
(面試內容)
load方法:程式一啟動,載入類的時候被呼叫,每個類呼叫一次
initialize方法:第一次用到這個類的時候被呼叫,總是先呼叫父類
總結:1、當程式啟動時,就會載入專案中所有的類和分類,而且載入後會呼叫每個類和分類的+load方法,只會呼叫一次、
2、當第一次使用某乙個類時,就會呼叫當前類的+initialize方法
3、先載入父類,在載入子類(先呼叫父類的+load方法,在呼叫子類的+load方法)
先初始化父類,在初始化子類(先呼叫父類的+initialize方法,在呼叫子類的+initialize方法)
description:
-description
person *p = [[person alloc] init];
nslog(@"%@",p);
執行上述第二句時:
1、會呼叫物件p的-description方法
2、拿到-description方法的返回值(nsstring*)顯示到螢幕上
3、-description方法預設返回值是 「類名+記憶體位址」
因此,要想通過nslog(@"%@",p)輸出p的相關資訊就要重寫
-description方法
+description:
class c = [person class];
nslog(@"%@",c);
執行上述第二條語句時
1、會呼叫類的+description方法
2、拿到+description方法的返回值(nsstring*)顯示到螢幕上
3、+description方法的預設返回值為「類名」
nslog的擴充套件輸出:
1、nslog(@"%d",__line__);輸出當前的行號
//nslog輸出c語言字串時 不能有中文
2、nslog(@"%s",__file__);輸出檔案路徑(檔案路徑中不能有中文)
3、nslog(@"%d",__line__);輸出當前函式或者方法名
self基本使用:
多種方法呼叫類中的方法
person *p = [[person alloc] init];
[p test2];
執行步驟:
基礎:先利用物件p中的isa指標 到person類中去尋找 test2方法
而 在person類中每乙個 方法都對應這乙個self類的資料(方法的位址)改位址存放於isa指標當中
具體步驟:
1、把test2包裝成sel型別資料
2、去isa中的sel位址 到person類中查詢對應的方法
3、根據方法位址呼叫相應的方法
呼叫方法的兩種方法:
1、直接呼叫
[p test];
第二種 利用sel=方法名位址
[p performselector:@selector(test2)];
第三種每個方法內部都會隱藏乙個_cmd 代表當前方法
總結:sel其實是對方法的一種包裝,將方法包裝秤乙個sel型別的資料,去找到相應的方法位址,找到方法位址就可以呼叫方法
IOS學習 OC基礎學習1
oc 在c的基礎上增加了一層最好的物件導向語法 副檔名.m 基本語法 1 關鍵字 基本上所有的關鍵字都是以 開頭 2 字串一 開頭 其他與法 引進了bool型別 yes,no nil 相當於c語言中的null,也是0 nslog hello nslog d 27 與 之間無空格,且輸出之後自動換行 ...
iOS開發學習筆記 OC基礎
for int i 0 i items count i for nsstring item in items 快速列舉的限制 如在迴圈體中增加或刪除物件,則不能使用快速列舉,這時只能用for迴圈。nslog函式負責將指定字串輸出到xcode控制台。nslog的實參個數並不確定,但第乙個實參是必須的,...
IOS學習 C語言基礎學習4
函式 封裝乙個功能 1 什麼情況下定義函式 新增乙個常用的新功能 2 函式的定義格式 返回值型別 函式名 形式引數列表 1 形式引數 定義函式時函式名後面中的引數 2 實際引數 呼叫函式時,傳入的具體資料 3 如果是基本資料型別作為函式形參,純粹是值傳遞,修改函式內部形參的值,並不會影響外面的實參的...