【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法
.
一. 類定義
類定義需要實現兩部分 :?
-- 接口部分 : 定義類的成員變量和方法, 方法是抽象的, 在頭文件中定義;
-- 實現部分 : 引入接口部分的頭文件, 實現抽象方法;
1. 接口部分定義?
(1) 接口部分定義格式
接口部分定義格式 :?
@interface className : superClassName
{
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
總結
以上是生活随笔為你收集整理的【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 应用开发】 Andro
- 下一篇: 【嵌入式开发】嵌入式 开发环境 (远程登