OC構造函數總結

http://my.oschina.net/luoguankun/blog/219532

一、成員變量的作用域
· @public
· 在任何地方都能直接訪問對象的成員變量
· @private
· 只能在當前類的對象方法中訪問
· @protected(可以不寫,默認)
· 能在當前類和子類的對象方法中直接訪問
· @package
· 只要處在同一個框架中,就能直接訪問對象的成員變量
· @interface和@implementation中不能聲明同名的成員變量
· 在@implementation中聲明變量,默認是@private的
二、點語法
· 點語法的本質還是方法調用,不是調用成員變量
· 編譯器遇到點語法時,會把點語法轉成方法
?
1
2
3

p.age = 10; //[p setAge:10];

intage = p.age; //[p age];

三、構造方法
· 用來初始化對象的方法,對象方法,以減號開頭
· 為了讓對象創建出來,成員變量就會有一些固定的值
· 重寫構造方法的注意點:
· 先調用父類的構造方法([super init])
· 再進行子類內部成員變量的初始化
· + alloc 方法
· 分配存儲空間
· - init 方法
· 初始化
· 實際上是這么創建對象的
?
1

Person *p5 = [[Person alloc] init]; //先分配存儲空間,再進行初始化

· 重寫NSObject類的init方法(無參數)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

  • (id)init

{

//一定要調用回super得init方法:初始化父類中聲明的一些成員變量和其他屬性

if(self = [super init]) {

    //初始化成功

    _age = 10;

}

returnself;  

}

· 帶參數的構造方法
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

  • (id)initWithName:(NSString *)name andAge:(int)age

{

if(self = [super init]) {

    _age = age;

    _name = name;

}

returnself;

}

四、分類
· 分類,在不改變原來模型的情況下,可以給某個類擴充一些方法
· 分類只能增加方法,不能增加成員變量
· 分類方法實現中可以訪問原來類中聲明的成員變量
· 分類的優先級最高,方法優先去分類中去找,再去原來類中去找,最后再去父類中找
· 分類可以重寫原來類中的方法,但是會覆蓋掉,會導致原來的方法失效,沒法再使用
· 方法調用的優先級:分類(最后參與編譯的分類優先) --> 原來類 --> 父類
· 分類的應用一般是擴展系統的類的方法,比如擴展NSString類的方法
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

  • (int)numberCountOfString:(NSString *)str

{

intcount = 0;

for(unsigned longi = 0; i < [str length]; i++) {

    unichar ch = [str characterAtIndex:i];

    if(ch >= '0'&& ch <='9') {

        count++;

    }

}

 

returncount;

//return [str numberCount];

}

//計算某個字符串中阿拉伯數字的個數(對象方法)

  • (int)numberCount

{

intcount = 0;

for(unsigned i = 0 ; i < [self length]; i++) {

    unichar ch = [self characterAtIndex:i];

    if(ch >= '0'&& ch <='9') {

        count++;

    }

}

 

returncount;

//return [NSString numberCountOfString:self];

}

五、類的本質
· 可以使用類創建對象,但是類本身也是一個對象,是個Class類型的對象,簡稱“類對象
· 先利用Class創建一個Person類對象,再利用Person類對象,創建Person類型的對象
· 重寫load()方法和initialize()方法
?
1
2
3
4
5
6
7
8
9
10
11

  • (void)load
    {
    NSLog(@"Student的load方法被調用");
    }

//在第一次被使用的時候就會被調用一次,監聽類第一次被使用的時候

  • (void)initialize
    {
    NSLog(@"Student-initialize方法被調用");
    }

· load()方法:
· 當程序啟動時,就會加載項目中所有的類和分類,而且加載后會調用每個類和分類的load方法。只會調用一次
· 當第一次使用某個類時,就會調用當前類的+initialize方法
· 先加載父類,再加載子類(先調用父類的load方法,再調用子類的load方法)
· 先初始化父類,再初始化子類(先調用父類的initialize方法,再調用子類的initialize方法
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

//利用Person這個類創建了3個Person類型的對象
Person *p = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Person *p3 = [[Person alloc] init];

//先利用Class創建一個Person類對象
//再利用Person類對象,創建Person類型的對象
//獲取內存中的類對象
Class c = [p class];
Class c2 = [p class];

//獲取內存中的類對象
Class c3 = [Person class];
NSLog(@"c=%p,c2=%p,c3=%p",c,c2,c3); //c的地址等于c2,也等于c3

//程序先加載父類,再加載子類,而且類只被加載一次
//只要加載了類,就會調用load類方法
//initialize類方法是在類第一次被初始化時,被調用,如果在使用子類的時候,父類也會被調用該方法
//分類也會被加載,如果原始類和分類都重寫了initialize方法,那么分類的initialize方法優先被調用,原始類不調用
GoodStudent *stu = [[GoodStudent alloc] init];

六、自動生成getter和setter方法
· @property自動生成某個成員變量的聲明
· @synthesize自動生成getter和setter的實現,并且會訪問指定的成員變量
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14

//自動生成某個成員變量的聲明
//編譯器特性:編譯器當遇到@property時,自動轉換成setter和getter聲明方法
// - (void)setAge:(int)age;
// - (int)age;
@propertyintage; //生成_age成員變量
@propertydoubleheight; //生成_height成員變量
@propertydoubleweight; //生成_weight成員變量
@property NSString *name; //生成_name成員變量

//@synthesize自動生成getter和setter的實現,并且會訪問指定的成員變量
@synthesize age = _age;
@synthesize height = _height;
//用逗號分隔
@synthesize weight = _weight,name = _name;

· @synthesize可以不寫,只寫@property就可以完成成員變量getter和setter方法的聲明和實現
七、description方法
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

import <Foundation/Foundation.h>

import "Person.h"

intmain()
{
//輸出行號
NSLog(@"%d",LINE);

//NSLog輸出C語言字符串的時候,不能有中文
NSLog(@"%s",__FILE__);

//輸出源文件路徑名稱
printf("%s\n",__FILE__);

//輸出當前函數名
NSLog(@"%s",__func__);

return0;

}

voidtest()
{
Person *p = [[Person alloc] init];
p.age = 20;
p.name = @"Jack";

//1.首先會調用對象的-description方法,返回字符串
//2.拿到-description方法的返回值,并顯示到屏幕上
//description方法默認返回“類名+內存地址” <Person 0x0232010>
//所以需要重寫description方法
//相當于java的Object的toString()方法
NSLog(@"%@",p.description);

Person *p2 = [[Person alloc] init];
p2.age = 22;
p2.name = @"Ted";
NSLog(@"%@",p2.description);

}

voidtest2()
{
Class c = [Person class];

//1.首先會調用類的+description方法
//2.拿到+description方法的返回值(NSString *)顯示到屏幕上
NSLog(@"%@",c);

}

//重寫description方法

  • (NSString *)description
    {
    //死循環
    //NSLog(@"%@",self);

    return[NSString stringWithFormat:@"age=%d,name=%@",_age,_name];
    }

  • (NSString *)description
    {
    return@"sss";
    }

八、id類型
· id是一種類型
· id是萬能指針,能操作任何OC對象,id內部已經包含,所以不用再加
· 示例:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

intmain()
{
//id是一種類型
//id是萬能指針,能操作任何OC對象,id內部已經包含,所以不用再加
//id d;

//Person *p = [Person new];
     
//id == NSObject*
//NSObject *o = [Person new];

//只適用OC對象
id person = [Person new];
[person setAge:10];
[person setObj:@"luoguankun"];

NSLog(@"age=%d",[person age]);
test(person);
 
return0;

}

九、SEL
· SEL其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去找對應的方法地址,找到方法地址就可以調用方法
· 其實消息就是SEL
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

intmain()
{
//[Person test];
Person *p = [[Person alloc] init];

//1.把test2包裝成SEL類型的數據
//2.根據SEL數據找到對應的方法地址
//3.根據方法地址調用對應的方法
//[p test2];

//通過SEL簡介調用test方法
[p performSelector:@selector(test2)];

//上面的調用相當于下面這兩步
//SEL s = @selector(test2);
//[p performSelector:s];

 

//通過SEL帶參數的形式調用test3方法,不要忘了帶上冒號
[p performSelector:@selector(test3:andluo:) withObject:@"luo"withObject:@"feng"];

return0;

}

//字符串轉換成SEL
NSString *name = @"test2";
SEL s = NSSelectorFromString(name);

//SEL轉換成字符串

  • (void)test2
    {
    //死循環
    //[self performSelector:_cmd];

    //_cmd是SEL類型,代表當前方法
    //通過NSString的fromSelector方法把SEL轉換為字符串
    NSString *str = NSStringFromSelector(_cmd);

    //打印_cmd
    NSLog(@"%@",str); //打印test2
    }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容