【IOS 開發】Object - C 面向對象 - 類 , 對象 , 成員變量 , 成員方法

.程序員





一. 類定義


類定義須要實現兩部分ide

-- 接口部分 : 定義類的成員變量和方法, 方法是抽象的, 在頭文件中定義;spa

-- 實現部分 : 引入接口部分的頭文件, 實現抽象方法;指針



1. 接口部分定義 



(1) 接口部分定義格式


接口部分定義格式code

@interface className : superClassNameorm

{對象

type _variableName;繼承

... ...接口

}內存

- (type) methodName : type parameterName;

@end

-- 接口定義開始標識 : @interface 表示接口開始定義;

-- 接口定義結束標識 : @end 表示接口定義結束;

-- 接口名稱定義 : 緊跟在 @interface 後 是類名稱;

-- 父類接口 : 若是有父類, 在接口名稱後面的 : 後寫出;

-- 成員變量定義 : 在 @interface 後的 {} 中定義 成員變量;

-- 成員方法 : 在 {} 中定義完成員變量後定義成員方法;



(2) 成員變量定義

.

注意 : 成員方法中的 返回值類型 和 參數類型必須使用 () 括起來, 以便與 C 語言方法區分;

.

成員變量簡介

-- 定義格式 : 類型 成員變量名, 如 int _age;

-- 定義位置 : 在 @interface 的下一行的 大括號中定義, 至右成員變量是定義在大括號中的;

-- 可用類型 : 基本類型, 構造類型, 各類指針型類型;

-- 命名規範 : 成員變量通常建議 使用 "_" 開頭, 駝峯式命名;



(3) 成員方法


成員方法簡介

-- 成員方法格式 : 方法類型標識 (返回值類型) 方法名稱 : (參數類型) 參數名稱 方法簽名關鍵字 : (參數類型) 參數名稱;

-- 方法標識符 : "+" 表示類方法, "-" 表示實例方法;

-- 方法簽名關鍵字 : 由 方法名, 形參標籤, 冒號組成;

-- 形參標籤 : Object-C 慣例, 除了第一個形參以外, 爲每一個形參都制定一個形參標籤;


方法簽名意義

-- "method" : 表示方法沒有參數;

-- "method : " : 表示方法有一個形參;

-- "method : param : " : 表示方法有兩個形參;



(4) 接口部分代碼示例


示例

/*************************************************************************
    > File Name: Student.h
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 日 12/14 19:51:16 2014
	類接口部分示例
 ************************************************************************/
#import <Foundation/Foundation.h>

@interface Student : NSObject
{
	/*
	 * 成員變量定義在 接口聲明的花括號中
	 * 注意成員變量以前以 "_" 開頭
	 */
	NSString * _name;
	int _age;
}

/*
 * 定義 setData : setAge : 方法
 * - 表示該方法須要經過對象調用
 * setAge 是形參標籤
 */
- (void) setData : (NSString*)name setAge:(int)age;

// 定義 speak : 方法
- (void) speak : (NSString*) content;

// 定義一個不帶參數的方法
- (NSString*) toString;

+ (void) fuck;



2. 實現部分定義



(1) 實現部分定義格式


實現部分格式

@implementation className

{

type _variable;

}

- (type) methodName : (type)param

{

//方法體

}

@end



(2) 類名 與 父類


實現部分類名要求 : 類名 與 類 接口部分類名相同;


父類繼承 : 若是有父類, 可使用 "@implementation 類名 : 父類名" 表示;



(3) 實現部分的成員變量 和 成員方法


聲明成員變量 : 若是在實現部分聲明成員變量, 那麼該成員變量在外部不可訪問, 只能在實現部分訪問;


成員方法簡介

-- 實現抽象成員方法 : 實現接口部分定義的抽象方法, 即爲接口部分方法寫方法體;

-- 聲明成員方法 : 在實現部分聲明成員方法, 外部不可訪問, 只能在實現部分進行訪問;



(4) 抽象方法示例


代碼示例

/*************************************************************************
    > File Name: Student.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 日 12/14 20:04:28 2014
 ************************************************************************/
/*
 * 這裏導入 Student.h 包便可, 由於 在 Student.h 包已經導入了 Foundation.h 頭文件了
 */
 #import <Student.h>

 @implementation Student
 {
	//定義的該成員變量 只能在實現部分使用, 是隱藏的成員變量;
	int _class;
 }

 //定義了 setData : setAge : 方法
 - (void) setData : (NSString*)name setAge:(int)age
 {
	_name = name;
	_age = age;
 }

 - (void) speak : (NSString)content
 {
	NSLog(@"%@", content);
 }

 //定義了一個帶返回值的方法
 - (NSString*) toString
 {
	return [NSString stringWithFormat : @"name = %@, age = %d", _name, _age];
 }

 + (void) fuck
 {
	NSLog(@"fuck");
 }
@end




二. 對象詳解



1. 對象 定義, 建立 和 方法調用



(1) 對象定義


變量定義語法 : 類型* 對象名;

-- 示例 : 如上面定義的 Student 類型的對象, Student* student;



(2) 建立對象


建立對象語法 : [[類名 alloc] 初始化方法] , 示例 [[Student alloc] init];

-- alloc : alloc 是一個關鍵字, 表示這是建立對象的語句, 至關於 Java 中得 new, 負責分配內存空間 和 建立對象;

-- 初始化方法 : 全部的對象都從 NSObject 繼承了一個默認的初始化方法 init;


另外一種建立對象方法 : [類名 new], 示例 [Student new] ;

-- 解析 : 這是爲了照顧 Java 程序員習慣, 通常不經常使用;



(3) 方法調用


方法調用語法 : [調用者 方法名:參數1 形參標籤:參數2 ...], 示例 [stident fuck];

-- 調用者 : 能夠是對象 也能夠是 類, 對象調用實例方法, 類 調用類方法;



(4) 示例 


代碼示例

-- 代碼

/*************************************************************************
    > File Name: StudentTest.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 日 12/28 21:58:41 2014
 ************************************************************************/

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, char * argv[])
{
	@autoreleasepool {
		//定義變量
		Student* student;
		//建立變量
		student = [[Student alloc] init];
		//方法調用, 調用類方法, 注意 類方法只能由類調用, 不能由對象調用
		[Student fuck];
		//調用帶參數的方法
		[student speak : @"fuck you!"];
		//爲成員變量賦值
		[student setData : @"悟空" setAge : 25];
		//打印成員變量
		NSString* stuStr = [student toString];
		NSLog(@"Student is : %@", stuStr);
	}
}

-- 執行結果

octopus-2:oc_object octopus$ clang -fobjc-arc -framework Foundation Student.m StudentTest.m
octopus-2:oc_object octopus$ ./a.out 
2014-12-28 23:22:37.702 a.out[415:507] fuck
2014-12-28 23:22:37.704 a.out[415:507] fuck you!
2014-12-28 23:22:37.705 a.out[415:507] Student is : name = 悟空, age = 25




2. 對象 和 變量 



(1) 對象 和 指針變量概念


概念引入 : Student* student = [[Student alloc] init], 產生了 Student 對象 和 student 變量;

-- 對象 : 建立了一個 Student 類型的對象;

-- 指針變量 : person 就是指向對象的指針變量;



(2) 對象 和 指針變量存儲內容


對象 和 變量的存儲內容

-- 對象 : 存儲了建立的 Student 對象的 成員變量;

-- 指針變量 : 存儲了該對象在堆內存中得首地址, 即第一個成員變量的首地址;



(3) 對象 和 指針變量 的位置


對象 和 變量的保存地址

-- 對象 : 對象保存在 堆(heap)內存中;

-- 指針變量 : 保存在main()方法的動態存儲區中;



(4) 對象 與 指針變量對應關係


對應關係 : 一個指針只能指向一個對象, 一個對象能夠有多個指針指向她;



(5) 對象釋放


內存泄露 : 若是沒有指針指向某個對象, 那麼這個對象須要被釋放掉, 不然會形成內存泄露;

-- 解決方案 : 使用自動引用計數, 即將程序放在 @autoreleasepool{}中;




3. self 關鍵字



(1) 調用對象自己的方法 或 變量


調用自己方法 : 在對象中, 調用對象自己的方法 或 變量;

-- 調用自己方法 : [self 方法名 : 參數1 形參標籤:參數2 ...] ;

-- 調用自己成員變量 : self->成員變量名 ;


注意 : self 不能調用 類方法 和 在類方法中調用, self 使用方法與 對象相同;



(2) 做用 


區分紅員變量 和 局部變量 : 若是局部變量與成員變量重名, 使用 self->成員變量名 能夠表示成員變量, 默認的名稱就是局部變量;



(3) 代碼示例 


代碼示例 : 修改上面的 Student.m 代碼, 編譯後執行, 注意有警告, 方法中得成員變量 與 形參名稱 重複;

-- 代碼

/*************************************************************************
    > File Name: Student.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 日 12/14 20:04:28 2014
 ************************************************************************/
/*
 * 這裏導入 Student.h 包便可, 由於 在 Student.h 包已經導入了 Foundation.h 頭文件了
 */
 #import "Student.h"

 @implementation Student
 {
	//定義的該成員變量 只能在實現部分使用, 是隱藏的成員變量;
	int _class;
 }

 //定義了 setData : setAge : 方法
 - (void) setData : (NSString*)_name setAge:(int)_age
 {
	//self 關鍵字用於 區分 成員變量 和 方法的形參 
	self->_name = _name;
	self->_age = _age;
 }

 - (void) speak : (NSString*)content
 {
	NSLog(@"%@", content);
 }

 //定義了一個帶返回值的方法
 - (NSString*) toString
 {
	 //self 關鍵字用於調用本對象的方法
	[self speak : @"正在調用 toString 方法 : "];
	return [NSString stringWithFormat : @"name = %@, age = %d", _name, _age];
 }

 + (void) fuck
 {
	NSLog(@"fuck");
 }
@end


-- 執行結果

octopus-2:oc_object octopus$ clang -fobjc-arc -framework Foundation Student.m StudentTest.m
Student.m:21:16: warning: local declaration of '_name' hides instance variable [-Wshadow-ivar]
        self->_name = _name;
                      ^
Student.m:22:15: warning: local declaration of '_age' hides instance variable [-Wshadow-ivar]
        self->_age = _age;
                     ^
2 warnings generated.
octopus-2:oc_object octopus$ ./a.out 
2014-12-29 00:49:46.728 a.out[558:507] fuck
2014-12-29 00:49:46.730 a.out[558:507] fuck you!
2014-12-29 00:49:46.731 a.out[558:507] 正在調用 toString 方法 : 
2014-12-29 00:49:46.731 a.out[558:507] Student is : name = 悟空, age = 25



4. id類型



(1) id 類型


id類型 : 表明全部的對象類型;

-- 示例 : id student = [[Student alloc] init];



(2) 動態綁定


動態綁定 : 跟蹤對象所屬類, 在運行時斷定對象所屬類, 並在運行時肯定調用方法, 不是在編譯時;

-- 使用狀況 : id 類型的變量調用方法時會執行動態綁定;



(3) 代碼示例


代碼示例

-- 代碼

/*************************************************************************
    > File Name: StudentTest.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 日 12/28 21:58:41 2014
 ************************************************************************/

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, char * argv[])
{
	@autoreleasepool {
		//定義變量
		Student* student;
		//建立變量
		student = [[Student alloc] init];
		//方法調用, 調用類方法, 注意 類方法只能由類調用, 不能由對象調用
		[Student fuck];
		//調用帶參數的方法
		[student speak : @"fuck you!"];
		//爲成員變量賦值
		[student setData : @"悟空" setAge : 25];
		//打印成員變量
		NSString* stuStr = [student toString];
		NSLog(@"Student is : %@", stuStr);
	}
}


--執行結果

octopus-2:oc_object octopus$ clang -fobjc-arc -framework Foundation Student.m StudentTest.m
Student.m:22:16: warning: local declaration of '_name' hides instance variable [-Wshadow-ivar]
        self->_name = _name;
                      ^
Student.m:23:15: warning: local declaration of '_age' hides instance variable [-Wshadow-ivar]
        self->_age = _age;
                     ^
2 warnings generated.
octopus-2:oc_object octopus$ ./a.out 
2014-12-29 01:09:23.548 a.out[605:507] fuck
2014-12-29 01:09:23.550 a.out[605:507] fuck you!
2014-12-29 01:09:23.550 a.out[605:507] 正在調用 toString 方法 : 
2014-12-29 01:09:23.550 a.out[605:507] Student is : name = 悟空, age = 25
2014-12-29 01:09:23.551 a.out[605:507] 正在調用 toString 方法 : 
2014-12-29 01:09:23.551 a.out[605:507] id is : name = 八戒, age = 23
相關文章
相關標籤/搜索