類
1.類的定義:
類=屬性+方法;
-屬性代表類的特征
-方法是類能對變化做出的反應
類定義的格式:類的聲明和類的實現組成
-接口(類的聲明):@interface 類名:基類的名字
.類名首字母要大寫
.冒號表示繼承關系,冒號后面的是類的父類
.NSObject是OC所有類的基類
.類的聲明放在“類名+.h”文件中,要由兩部分組成:實例變量和方法
-實現(類的實現):@implementation類名
.方法實現
-都用@end結束c
2.類的使用:
OC中,對象通過指針來聲明 如:ClassA *object;
OC中對象的創建,使用alloc來創建一個對象,編譯器會給object對象分配一塊可用的內存地址,然后需要對對象進行初始化即調用init方法,這樣這個對象才可以使用,如:
Person *person=[Person alloc]; //創建對象分配空間
person=[person init]; //初始化賦初值,
初始化后:int=0,char=“*0”?,bool=FALSE
同一個類的每個對象有不同的實例變量的存儲空間
同一類的每個對象共享該類的方法
方法嵌套的形式來調用,如:ClassA *object=[[ClassA alloc] init];
3.類的訪問權限
三種訪問權限:
-公有的:@public
-私有的:@private
-保護的:@protected
屬性默認的權限是保護的
方法默認的權限是公有的
4.方法定義
無參無返: -(void)print;
無參有返: -(Person *)register;
有參無返: -(void)intuit:(int)newId;
有參有返: -(Person *)init:(int)newId;
帶一個參數的方法
-(Person *) init:(int) newID;
帶兩個參數的方法:
-(Person *) init:(int) newID:(int) newAge;
“:”是方法名的一部分
-第一個方法名:init
-第二個方法名:init:
-第三個方法名:init::
多參數方法定義:
-(Person *)initWithId:(int) newID andAge:(int) newAge andName:(NSString *)name;
可以在方法名前面加任意標記如“WithId”,“andAge”,“andName”以此類推
5.實例
main:
#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(@"汪汪"); } @end
Dog.h:類的聲明
#import <Foundation/Foundation.h> @interface Dog : NSObject //聲明類Dog,繼承根基類NSObject //類的屬性 { @public; //設置類的屬性為公有(一般不允許使用) NSString *name; int health; } //對象方法 -(void)bark; @end
6.類方法和對象方法對比
·對象方法(實例方法)
-以減號“-”開頭
-只能讓對象調用,沒有對象,這個方法根本不可能被執行
-對象方法能訪問實例變量
·類方法
-以加號“+”開頭
-只能用類名調用,對象不能調用
-類方法中不能訪問實例變量(成員變量)
-使用場合:當不需要訪問成員變量的時候,盡量用類方法
-類方法和對象方法可以同名7.屬性的存取方法
·獲取屬性值(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; } @end
Dog.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; @end
9.自動生成屬性的存取方法
·@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.繼承
·不改變原來模型的基礎上,拓充方法
·建立了類與類之間的聯系
·抽取了公共代碼
·減少冗余代碼
·壞處:耦合性強