.程序員
類定義須要實現兩部分 : ide
-- 接口部分 : 定義類的成員變量和方法, 方法是抽象的, 在頭文件中定義;spa
-- 實現部分 : 引入接口部分的頭文件, 實現抽象方法;指針
接口部分定義格式 : code
@interface className : superClassNameorm
{對象
type _variableName;繼承
... ...接口
}內存
- (type) methodName : type parameterName;
@end
-- 接口定義開始標識 : @interface 表示接口開始定義;
-- 接口定義結束標識 : @end 表示接口定義結束;
-- 接口名稱定義 : 緊跟在 @interface 後 是類名稱;
-- 父類接口 : 若是有父類, 在接口名稱後面的 : 後寫出;
-- 成員變量定義 : 在 @interface 後的 {} 中定義 成員變量;
-- 成員方法 : 在 {} 中定義完成員變量後定義成員方法;
.
注意 : 成員方法中的 返回值類型 和 參數類型必須使用 () 括起來, 以便與 C 語言方法區分;
.
成員變量簡介 :
-- 定義格式 : 類型 成員變量名, 如 int _age;
-- 定義位置 : 在 @interface 的下一行的 大括號中定義, 至右成員變量是定義在大括號中的;
-- 可用類型 : 基本類型, 構造類型, 各類指針型類型;
-- 命名規範 : 成員變量通常建議 使用 "_" 開頭, 駝峯式命名;
成員方法簡介 :
-- 成員方法格式 : 方法類型標識 (返回值類型) 方法名稱 : (參數類型) 參數名稱 方法簽名關鍵字 : (參數類型) 參數名稱;
-- 方法標識符 : "+" 表示類方法, "-" 表示實例方法;
-- 方法簽名關鍵字 : 由 方法名, 形參標籤, 冒號組成;
-- 形參標籤 : Object-C 慣例, 除了第一個形參以外, 爲每一個形參都制定一個形參標籤;
方法簽名意義 :
-- "method" : 表示方法沒有參數;
-- "method : " : 表示方法有一個形參;
-- "method : param : " : 表示方法有兩個形參;
示例 :
/************************************************************************* > 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;
實現部分格式 :
@implementation className
{
type _variable;
}
- (type) methodName : (type)param
{
//方法體
}
@end
實現部分類名要求 : 類名 與 類 接口部分類名相同;
父類繼承 : 若是有父類, 可使用 "@implementation 類名 : 父類名" 表示;
聲明成員變量 : 若是在實現部分聲明成員變量, 那麼該成員變量在外部不可訪問, 只能在實現部分訪問;
成員方法簡介 :
-- 實現抽象成員方法 : 實現接口部分定義的抽象方法, 即爲接口部分方法寫方法體;
-- 聲明成員方法 : 在實現部分聲明成員方法, 外部不可訪問, 只能在實現部分進行訪問;
代碼示例 :
/************************************************************************* > 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
變量定義語法 : 類型* 對象名;
-- 示例 : 如上面定義的 Student 類型的對象, Student* student;
建立對象語法 : [[類名 alloc] 初始化方法] , 示例 [[Student alloc] init];
-- alloc : alloc 是一個關鍵字, 表示這是建立對象的語句, 至關於 Java 中得 new, 負責分配內存空間 和 建立對象;
-- 初始化方法 : 全部的對象都從 NSObject 繼承了一個默認的初始化方法 init;
另外一種建立對象方法 : [類名 new], 示例 [Student new] ;
-- 解析 : 這是爲了照顧 Java 程序員習慣, 通常不經常使用;
方法調用語法 : [調用者 方法名:參數1 形參標籤:參數2 ...], 示例 [stident fuck];
-- 調用者 : 能夠是對象 也能夠是 類, 對象調用實例方法, 類 調用類方法;
代碼示例 :
-- 代碼 :
/************************************************************************* > 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
概念引入 : Student* student = [[Student alloc] init], 產生了 Student 對象 和 student 變量;
-- 對象 : 建立了一個 Student 類型的對象;
-- 指針變量 : person 就是指向對象的指針變量;
對象 和 變量的存儲內容 :
-- 對象 : 存儲了建立的 Student 對象的 成員變量;
-- 指針變量 : 存儲了該對象在堆內存中得首地址, 即第一個成員變量的首地址;
對象 和 變量的保存地址 :
-- 對象 : 對象保存在 堆(heap)內存中;
-- 指針變量 : 保存在main()方法的動態存儲區中;
對應關係 : 一個指針只能指向一個對象, 一個對象能夠有多個指針指向她;
內存泄露 : 若是沒有指針指向某個對象, 那麼這個對象須要被釋放掉, 不然會形成內存泄露;
-- 解決方案 : 使用自動引用計數, 即將程序放在 @autoreleasepool{}中;
調用自己方法 : 在對象中, 調用對象自己的方法 或 變量;
-- 調用自己方法 : [self 方法名 : 參數1 形參標籤:參數2 ...] ;
-- 調用自己成員變量 : self->成員變量名 ;
注意 : self 不能調用 類方法 和 在類方法中調用, self 使用方法與 對象相同;
區分紅員變量 和 局部變量 : 若是局部變量與成員變量重名, 使用 self->成員變量名 能夠表示成員變量, 默認的名稱就是局部變量;
代碼示例 : 修改上面的 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
id類型 : 表明全部的對象類型;
-- 示例 : id student = [[Student alloc] init];
動態綁定 : 跟蹤對象所屬類, 在運行時斷定對象所屬類, 並在運行時肯定調用方法, 不是在編譯時;
-- 使用狀況 : id 類型的變量調用方法時會執行動態綁定;
代碼示例 :
-- 代碼 :
/************************************************************************* > 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