每一個(gè)實(shí)例變量定義兩個(gè)方法:設(shè)置變量的setter方法 獲取變量值的getter方法
set方法的書(shū)寫(xiě)規(guī)范
set方法一定是一個(gè)對(duì)象方法
set方法一定不能有返回值
set方法必須以set開(kāi)頭
set之后跟的是 實(shí)例變量去掉下劃線,并且首字母大寫(xiě)
set方法一定有參數(shù),而且參數(shù)的類型和實(shí)例變量的類型一致
set方法的形參名 一般是 去掉下劃線的實(shí)例變量名
形參名不能和 實(shí)例變量名同名
set方法實(shí)現(xiàn)中,一定要用形參給實(shí)例變量賦值
get方法的書(shū)寫(xiě)規(guī)范
get方法一定是一個(gè)對(duì)象方法
get方法一定有返回值,返回值的類型和實(shí)例變量的類型要一致
get方法的方法名 是去掉下劃線的實(shí)例變量名
get方法一定沒(méi)有參數(shù)
get方法的實(shí)現(xiàn)中,一定是返回實(shí)例變量值
下面演示set和get方法的代碼
我們創(chuàng)建一個(gè)Person類在.h文件中的代碼如下:
#import <Foundation/Foundation.h>@interface Person : NSObject{ NSString *_name; int _age;}// 成員變量_name的setter方法和getter方法的聲明- (void)setName:(NSString *)name;- (NSString *)name;// 成員變量_age的setter方法和getter方法的聲明- (void)setAge:(int)age;- (int)age;@end
.m文件中的代碼如下:
#import "Person.h"@implementation Person// 成員變量_name的setter方法和getter方法的實(shí)現(xiàn)- (void)setName:(NSString *)name{ _name = name; }- (NSString *)name{ return _name;}// 成員變量_age的setter方法和getter方法的實(shí)現(xiàn)- (void)setAge:(int)age{ //在這可以限制輸入的年齡是否合法 if (age >= 18) { _age = age; } else { _age = 18; } }- (int)age{ return _age;}@end
OC中沒(méi)有方法的重載,所謂的參數(shù)多一個(gè)是因?yàn)榉椒ǖ拿Q變了,提示:do: : : :
OC中static關(guān)鍵字的使用:唯一要注意的是成員變量不能定義成static,其它時(shí)候的使用跟C語(yǔ)言中一樣,請(qǐng)看我之前的博客 >---點(diǎn)我就能看到---<
OC中的self關(guān)鍵字,self用到類方法中代表本類,self用到對(duì)象方法中表示這個(gè)對(duì)象
self修飾變量:會(huì)訪問(wèn)成員變量請(qǐng)看代碼:(依然根據(jù)Person類)在.m文件中
// 成員變量_name的setter方法和getter方法的實(shí)現(xiàn)- (void)setName:(NSString *)name{ self->speed = speed;// self->speed等價(jià)于_name// _name = name; }- (NSString *)name{ return _name;}
這里再次說(shuō)一下關(guān)于面對(duì)對(duì)象的四大特性分別為
1.抽象 2.封裝 3.繼承 4.多態(tài)
抽象性:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問(wèn)題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。比如,我們要設(shè)計(jì)一個(gè)學(xué)生成績(jī)管理系統(tǒng),考察學(xué)生這個(gè)對(duì)象時(shí),我們只關(guān)心他的班級(jí)、學(xué)號(hào)、成績(jī)等,而不用去關(guān)心他的身高、體重這些信息。抽象包括兩個(gè)方面,一是過(guò)程抽象,二是數(shù)據(jù)抽象。過(guò)程抽象是指任何一個(gè)明確定義功能的操作都可被使用者看作單個(gè)的實(shí)體看待,盡管這個(gè)操作實(shí)際上可能由一系列更低級(jí)的操作來(lái)完成。數(shù)據(jù)抽象定義了數(shù)據(jù)類型和施加于該類型對(duì)象上的操作,并限定了對(duì)象的值只能通過(guò)使用這些操作修改和觀察。
有關(guān)于封裝,繼承,多態(tài)請(qǐng)看我之前的博客(還介紹了分類) >---請(qǐng)點(diǎn)擊這里---<
成員變量修飾符的介紹
@PRivate 私有的,表示只能在當(dāng)前類中使用 不可以在子類中使用 但是被子類繼承的
@protected 受保護(hù)類型,表示只能在當(dāng)前類和子類中訪問(wèn)(默認(rèn)是protected)
description方法:重寫(xiě)父類的description方法可以改變NSLog的輸出
如果在-description方法中使用NSLog打印self 會(huì)造成死循環(huán)
代碼如下
//重寫(xiě)父類的description-(NSString *)description{ // do something.... // 例如 return [NSString stringWithFormat:<#(NSString *), ...#>];}
類的本質(zhì)是對(duì)象
類對(duì)象屬于Class類型
// 獲取類對(duì)象的2種方式Class c = [Person class]; // 類方法// 或者Person *p = [Person new];Class c2 = [p class]; // 對(duì)象方法
類方法中不能調(diào)用成員變量
SEL
1.方法的存儲(chǔ)位置
typedef struct objc_selector *SEL;
2.SEL對(duì)象的創(chuàng)建
SEL s = @selector(test);SEL s2 = NSSelectorFromString(@"test");
3.SEL對(duì)象的其他用法
// 將SEL對(duì)象轉(zhuǎn)為NSString對(duì)象NSString *str = NSStringFromSelector(@selector(test));Person *p = [Person new];// 調(diào)用對(duì)象p的test方法[p performSelector:@selector(test)];
OC中的點(diǎn)語(yǔ)法 是Xcode的特性,Xcode幫我們做代碼替換
// Xcode會(huì)幫我們把下面的代碼替換成[person setAge:18];person.age = 18;// Xcode會(huì)幫我們把下面的代碼替換成[person age];int a = person.age;
@property 和 @synthesize
@property 編譯器指令,編譯器幫我們會(huì)進(jìn)行_age _name get/set方法的聲明
@synthesize幫我們實(shí)現(xiàn)了 實(shí)例變量的get和set方法
Xcode4.4之后@property既可以幫我進(jìn)行_age _name get/set方法的聲明,也可以實(shí)現(xiàn)實(shí)例變量的get和set方法
@property (nonatomic, assign) int age;@property (nonatomic, copy) NSString *name;
id是萬(wàn)能指針,可以指向任何對(duì)象
OC中的構(gòu)造方法
重寫(xiě)構(gòu)造方法,讓對(duì)象創(chuàng)建成功后,就有初始的值
OC中給對(duì)象進(jìn)行初始化的方法是:init對(duì)象方法 該方法返回的是一個(gè)對(duì)象(調(diào)用init方法的對(duì)象)
// 當(dāng)子類把父類的init覆蓋了,這是默認(rèn)的先執(zhí)行子類的- (instancetype)init{ //先讓父類把父類原來(lái)做的事情做完 self = [super init]; //判斷父類是否初始化成功 if (self) { //此處寫(xiě)子類初始化的內(nèi)容 _age = 18; //給年齡設(shè)置為默認(rèn)值 18歲 } return self; //self指代的事方法的調(diào)用者}
自定義構(gòu)造方法
.h文件代碼如下
#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, copy) NSString* name;@property (nonatomic, assign) int age;// 自定義構(gòu)造方法- (instancetype)initWithName:(NSString *)name andAge:(int)age;@end
.m文件代碼如下
#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name andAge:(int)age{ if (self = [super init]) { _name = name; _age = age; } return self;}@end
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注