【OC基礎】01-類和對象

類定義

在OC中,通常用二個文件描述一個類,一個是.h文件,一個是.m文件愛你:函數

1>:.h文件是類的聲明文件,用於聲明變量和方法。類的聲明使用關鍵字@interface和@end。this

2>:.m文件是類的實現文件,用於實現.h類中聲明的方法。類的實現使用關鍵字@implementation和@end。spa

方法

1> 方法的聲明和實現,都必須以 + 或者 - 開頭指針

  • + 表示類方法(靜態方法)
  • - 表示對象方法(動態方法)

2> 在.h中聲明的全部方法做用域都是public類型,不能更改調試

成員變量

成員變量的經常使用做用域有3種:code

1> @public 全局均可以訪問
2> @protected 只能在類內部和子類中訪問
3> @private 只能在類內部訪問orm

方法和屬性

1.Student.h類的聲明文件對象

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Student : NSObject {
 4     
 5     int age;
 6     @public
 7     int no;
 8     int score;
 9     
10     @protected
11     float height;
12     
13     @private
14     float weight;
15 }
16 - (int)age;
17 - (void)setAge:(int)newAge;
18 - (void)setAge:(int)newAge :(float)newHeight;
19 @end

1>第3行:用@interface聲明一個類Student,後面緊跟着的:表示繼承與NSObjectblog

2>第5行:定義了一個int類型的成員變量age,age的默認做用域是@protected,便可以在Student類內部和子類中訪問繼承

3>第16行:聲明瞭age的get方法,方法名就叫作age,OC建議get方法的名字跟成員變量保持一致。- 表示這是一個動態方法( + 則表示靜態方法),動態方法屬於對象,靜態方法屬於類。

4>地18行:方法的方法名是setAge:andHeight:

2.Student.m的實現文件

 1 #import "Student.h"
 2 
 3 @implementation Student
 4 
 5 - (int)age {
 6     NSLog(@"age...");
 7     return age;
 8 }
 9 
10 - (void) setAge:(int)newAge {
11     NSLog(@"setage...");
12     age = newAge;
13 }
14 
15 - (void) setAge:(int)newAge :(float)newHeight {
16     age = newAge;
17     height = newHeight;
18 }
19 
20 @end

第5行和第10行和15行實現了Student.h中聲明的方法

在Java或者C#中有一個屬性的概念,一般訪問成員變量不是直接訪問,而是訪問這些屬性。OC中的屬性和Java中的相似,都是經過get/set方法實現的,不過有一點不一樣的是,OC的get方法一般直接使用變量名。

 1 #import <Foundation/Foundation.h>
 2 #import "Student.h"
 3 int main(int argc, const char * argv[])
 4 {
 5 
 6     @autoreleasepool {
 7         
 8         // insert code here...
 9         Student *stu = [[Student alloc]init];
10         stu.age = 15;
11         NSLog(@"......");
12         
13         int age1 = stu.age;
14         NSLog(@"......");
15         
16         stu->no = 120;
17         [stu setAge:100];
18         int age = [stu age];
19         
20         NSLog(@"student no=%i,age is=%i,age1=%i",stu->no,age,age1);
21         NSLog(@"Hello, World!");
22         [stu release];
23     }
24     return 0;
25 }

1>第9行:建立一個Student類對象,分配空間並初始化

2>第10行獲取和設置age的值,等價於調用[stu setAge:15]和int age = [stu age]。點語法的本質是函數調用

2>第16行:公共成員變量no,若是不是公共變量,不能像這樣直接訪問。注意訪問方式:對象->成員變量

經過上面的例子咱們能夠看出,定義屬性的代碼都是很是相似的,因此在OC中提供了更簡單的方法,OC中能夠經過聲明@property,同時經過@synthesize自動生成get/set方法。

Student.h文件

1 #import <Foundation/Foundation.h>
2 
3 @interface Student : NSObject
4 
5 @property NSString *name;
6 @property NSString *birth;
7 @property float grade;
8 @end

Student.m文件

1 #import "Student.h"
2 
3 @implementation Student
4 
5 @synthesize name;
6 @synthesize birth=_birth;
7 
8 @end

main.m文件

 1 #import <Foundation/Foundation.h>
 2 #import "CateStudent.h"
 3 int main(int argc, const char * argv[])
 4 {
 5 
 6     @autoreleasepool {
 7         
 8         // insert code here...
 9         Student *stu = [[Student alloc]init];
10         stu.name=@"zhangsan";
11         stu.birth=@"1993-09-12";
12         stu.grade=99;
13         NSLog(@"name=%@ and birth=%@ grade=%f",stu.name,stu.birth,stu.grade);
14     }
15     return 0;
16 }

上面的例子包含了使用屬性擴展的三種狀況:

1>只聲明一個屬性a,不使用@synthesize實現(如grade):此時編譯器會使用_a做爲屬性的成員變量(若是沒有_a變量,編譯器會自動生成一個私有的成員變量_a)

2>聲明一個屬性a,使用@synthesize實現,可是沒有指定使用的成員變量(如name):此時編譯器會使用a做爲屬性的成員變量(若是沒有a變量,編譯器會自動生成一個私有的成員變量a)

3>聲明一個屬性a,使用@synthesize實現,指定使用的成員變量(如birth):此時編譯器會使用指定的成員變量

其實上面的過程在本質上也是生成對應的get/set方法,若是聲明瞭@property並且在.m文件裏自定義了實現方法,就會使用自定義方法。

self關鍵字

在C++中有一個this指針表示當前對象,在OC中也有一個self關鍵字表示當前對象或者類自己。

Student.h文件:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Student : NSObject
 4 
 5 @property NSString *name;
 6 @property float age;
 7 - (void)setName:(NSString *)name andAge:(int)age;
 8 +(void)print;
 9 +(void)showMsg;
10 @end

Student.m文件:

 1 #import "Student.h"
 2 
 3 @implementation Student
 4 
 5 -(void)setName:(NSString *)name andAge:(int)age{
 6     self.name = name;//調用setName
 7     self.age = age;//調用setAge
 8 }
 9 
10 +(void)print{
11     NSLog(@"......");
12 }
13 
14 +(void)showMsg{
15     [self print];
16 }
17 @end

main.m文件:

 1 #import <Foundation/Foundation.h>
 2 #import "CateStudent.h"
 3 int main(int argc, const char * argv[])
 4 {
 5 
 6     @autoreleasepool {
 7         
 8         // insert code here...
 9         Student *stu = [[Student alloc]init];
10         [stu setName:@"zhansan" andAge:12];
11         NSLog(@"name=%@ and age=%f",stu.name,stu.age);
12         [Student showMsg];
13     }
14     return 0;
15 }

在這個例子中self能夠調用靜態方法也能夠調用動態方法。可是調用的本質是不同的,動態方法調用既實例裏面的self,是對象的首地址;類方法裏面的self,是Class。

構造方法

在對象的建立時每每須要初始化調用init方法,接下來咱們看下如何建立init方法:

Student.h文件:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Student : NSObject
 4 
 5 @property NSString *name;
 6 @property float age;
 7 -(id)initWithName:(NSString*)name andAge:(int)age;
 8 
 9 +(id)stuWithName:(NSString*)name andAge:(int)age;
10 +(void)print;
11 +(void)showMsg;
12 @end

Student.m文件:

 1 import "Student.h"
 2 
 3 @implementation Student
 4 
 5 -(id)initWithName:(NSString*)name andAge:(int)age{
 6     if(self=[super init]){
 7         self.name=name;
 8         self.age=age;
 9     }
10     return self;
11 }
12 
13 +(id)stuWithName:(NSString*)name andAge:(int)age{
14     //類方法不能直接訪問實例方法,可是能夠經過建立對象訪問實例方法
15     Student *s = [[Student alloc]initWithName:name andAge:age];
16     return s;
17 }
18 
19 +(void)print{
20     NSLog(@"......");
21 }
22 +(void)showMsg{
23     [self print];
24 }
25 @end

main.m文件:

 1 #import <Foundation/Foundation.h>
 2 #import "CateStudent.h"
 3 int main(int argc, const char * argv[])
 4 {
 5 
 6     @autoreleasepool {
 7         
 8         // insert code here...
 9         Student *stu = [[Student alloc]initWithName:@"lisi" andAge:11];
10         NSLog(@"name=%@ and age=%f",stu.name,stu.age);
11         Student *stu1 = [Student stuWithName:@"wanger" andAge:14];
12         NSLog(@"name=%@ and age=%f",stu1.name,stu1.age);
13         [Student showMsg];
14     }
15     return 0;
16 }

description方法

在Java中基本每一個類都有一個toString()方法用於打印一個對象的信息,在OC中這個方法叫description,這個方法一般用於調試:

1 #import "Student.h"
2 
3 @implementation Student
4 
5 -(NSString*)description{
6     return [NSString stringWithFormat:@"{name:%@,age:%f}",self.name,self.age];
7 }
8 @end

默認狀況下若是咱們不重寫description方法,輸出內容是類名和地址。

總結

一、- 表示對象方法(動態方法),+ 表示類方法(靜態方法)

二、.語法的本質是get或者set函數調用

三、靜態方法中不能直接調用對象方法,可是能夠建立對象後調用此方法

相關文章
相關標籤/搜索