OC课堂随笔——类
1.類的定義
類=屬性+方法
--屬性代表類的特征
--方法是類能對變化做出的反應
類定義的格式:類的聲明和類的實現組成
--接口(類的聲明):@interface 類名:基類的名字
.類名的首字母要大寫
.冒號表示繼承關系,冒號后面的類是父類
.NSObject是所有類的基類
.類的聲明放在“類名+.h文件中,要由兩部分組成:實例對象和方法聲明”
--實現(類的實現):@implementation類名
.方法實現
都用@結束
?
2.類的使用
.oc中對象通過指針來聲明。如ClassA*object;
oc中對象的創建,使用alloc來創建一個對象。編譯器會給對象分配一塊可用的內存地址。然后需要對對象進行初始化即調用init方法,這樣這個對象才可以使用。
如:
Person *person=[Person alloc];
person=[person init];
或者可寫成:
Person *person=[[Person alloc] init];
.同一類的每個對象有不同的實例變量的存儲空間,同一類的每個對象共享該類的方法。
.方法嵌套的形式來調用,如:ClassA *object=[[ClassA alloc] init];
?
3.類的訪問權限
.三種訪問權限
--公有的@public ? ? ?類本身/子類/全部文件都能訪問
--私有的@private ? ?只有類本身可以訪問
--保護的@protect ? ?類本身和子類可以訪問
屬性默認的權限是保護的;
方法默認的權限是公有的;
?
4.方法的定義
.無參無返? -(void)print;
.無參有返 -(Person *)register;
有參無返 -(void)init : (int)newId;
有參有返 -(Person *)init:(int)newId;
?
5.多參數方法的定義
帶一個參數的方法
--(Person *)init:(int) newId;
待兩個參數的方法
-(Person *)init : (int) newId andAge?:(int) newAge;
: 是方法名的一部分
-第一個方法名:init :
-第二個方法名:init :andAge :
-(Person *)initWithId:(int) newID andAge:(int) newAge andName:(NSString *)name;
可以在方法名前面加任意標記如“WithId”,“andAge”,“andName”以此類推
?
6.類方法和對象方法對比
.對象方法(實例方法)
--以減號-開頭
--只能讓對象調用,沒有對象,方法不能被執行
--對象方法能訪問實例變量(成員變量)
類方法
--以加號+開頭
--只能用類名調用,對象不能調用
--類方法不能訪問實例變量
--使用場合:當不需要訪問成員變量的時候,盡量用類方法
--類方法和對象方法可以重名
?
實例:
main.m:
#import <Foundation/Foundation.h> #import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //創建對象,即實例化對象 Dog *haShiQi=[[Dog alloc]init]; //方法調用 [haShiQi bark]; //屬性賦值 haShiQi->health=120; haShiQi->name=@"哈士奇"; NSLog(@"狗的姓名:%@,健康值%d",haShiQi->name,haShiQi->health); } return 0; }Dog.m:類的實現
#import "Dog.h" //引用類的聲明文件 @implementation Dog //方法實現 -(void)bark{ NSLog(@"汪汪"); } @endDog.h:類的聲明
#import <Foundation/Foundation.h> @interface Dog : NSObject //聲明類Dog,繼承根基類NSObject //類的屬性 { @public; //設置類的屬性為公有(一般不允許使用) NSString *name; int health; } //對象方法 -(void)bark; @end7.屬性的存取方法:
獲取屬性值(getter)方法的定義
--作用:返回對象內部的成員變量
--命名規范:get方法的名一般和成員變量同名;
獲取屬性值(setter)方法的定義
--作用:用來設置成員變量,可以在方法里過濾掉一些不合理的值
--命名規范:
--方法都是以set開頭,而且后面跟上成員變量名,首字母必須大寫
--形參名稱不要和成員變量同名
?
8.getter和setter方法實例
main:
#import <Foundation/Foundation.h> #import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //創建對象,即實例化對象 Dog *haShiQi=[[Dog alloc]init]; //方法調用 [haShiQi bark]; //屬性賦值 [haShiQi setName:@"哈士奇"]; //調用setter方法賦值 [haShiQi setHealth:120]; NSLog(@"狗的姓名:%@ 健康狀況:%d",haShiQi.name,haShiQi.health); } return 0; }Dog.m:類的實現
#import "Dog.h" //引用類的聲明文件 @implementation Dog //方法實現 -(void)bark{ NSLog(@"汪汪"); } //setter方法 -(void)setName:(NSString *)newName{ name=newName; } //getter方法 -(NSString *)name{ return name; } //setter方法 -(void)setHealth:(int)newHealth{ health=newHealth; } //getter方法 -(int)health{ return health; } @endDog.h:類的聲明
#import <Foundation/Foundation.h> @interface Dog : NSObject //聲明類Dog,繼承根基類NSObject //類的屬性 { NSString *name; int health; } //對象方法 -(void)bark; -(void)setName:(NSString *)newName; //setter方法 -(NSString *)name; //getter方法 -(void)setHealth:(int)newHealth; -(int)health; @end9.自動生成屬性的存取方法
@property語法
@synthesize
封裝的好處
--過濾掉不合理的值
--屏蔽內部的賦值過程
--讓外界不必關注內部的細節
?
10.自動生成屬性的存取方法實例
main:
#import <Foundation/Foundation.h> #import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //創建對象,即實例化對象 Dog *haShiQi=[[Dog alloc]init]; //方法調用 [haShiQi bark]; //屬性賦值 [haShiQi setName:@"哈士奇"]; [haShiQi setHealth:120]; NSLog(@"狗的姓名:%@ 健康狀況:%d",haShiQi.name,haShiQi.health); } return 0; }Dog.m:類的實現 #import "Dog.h" //引用類的聲明文件 @implementation Dog //方法實現 -(void)bark{ NSLog(@"汪汪"); } @synthesize name,health; //封裝,代替了setter,getter @end
Dog.h:類的聲明 #import <Foundation/Foundation.h> @interface Dog : NSObject //聲明類Dog,繼承根基類NSObject //類的屬性 { @public; //設置類的屬性為公有 NSString *name; int health; } -(void)bark; @property int health; //封裝,代替了setter,getter @property NSString *name; @end
11.方法重載
·OC中不是嚴格的函數重載
命名沖突:
-(int)doSomething(int)X;
-(int)doSomething(float)X;
命名沖突:
-(int)doSomething(int)x:(int)y;
-(int)doSomething(float)x:(int)y;
不沖突:
-(int)doSomething(int)x:(int)y;
-(int)doSomething(int)x: andY:(float)y;
因為一個是“doSomething:”,“另一個是doSomething::”
?12.繼承
·不改變原來模型的基礎上,拓充方法
·建立了類與類之間的聯系
·抽取了公共代碼
·減少冗余代碼
·壞處:耦合性強
轉載于:https://www.cnblogs.com/jiangyicheng/p/5103897.html
總結
- 上一篇: YII自定义小物件
- 下一篇: httpclient 调用WebAPI