1. 程式人生 > >【IOS 開發】Object

【IOS 開發】Object

.

一. 類定義

類定義需要實現兩部分

-- 介面部分 : 定義類的成員變數和方法, 方法是抽象的, 在標頭檔案中定義;

-- 實現部分 : 引入介面部分的標頭檔案, 實現抽象方法;

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

.一. 類定義類定義需要實現兩部分 : -- 介面部分 : 定義類的成員變數和方法, 方法是抽象的, 在標頭檔案中定義;-- 實現部分 : 引入介面部分的標頭檔案, 實現抽象方法;1. 介面部分定義 (

iOS 開發Object-C 運算子

參考文章 : 1. 算術運算子算術運算子 : 加(+), 減(-), 乘(*), 除(/), 模(%), 自增(++);-- 其它運算 : 如果需要平方開放運算, 使用 math.h 中得方法即可;原始

iOS開發iOS移動端架構

引言:一個app的初始階段,必然是先滿足各種業務需求。然後,經過多次版本迭代之後,先前的由於急於滿足需求而導致的雜亂程式碼則會充斥整個專案。而此時,專案有了一定的規模,有了一定數量的開發人員,那麼為了達到快速迭代版本的需求,則是需要有一個強大的架構來支撐。

iOS開發Gitlab教程 (一)

一 、gitLab 建立工程 Project name : 工程名字起一個,最好和專案相關; Namespace : 你自己的gitLab工作空間,預設就好; Description : 描述,隨便寫。 Visibi

iOS開發判斷app啟動的方式(launchOptions)

iOS app啟動的方式有哪些: 自己啟動(使用者手動點選啟動)urlscheme啟動(關於urlScheme的詳解點選開啟連結)本地通知啟動  (自己寫的本地通知啟動,藍芽模組的啟動,地理圍欄的啟動)遠端通知啟動    (後臺伺服器的推送通知)在appdelegate.m

iOS開發SEL和Selector 原理小結

一 、Selector(選擇器)簡介 選擇器是用來選擇一個方法來為一個物件 執行的名稱,或是在編譯原始碼時替換該名稱的 唯一識別符號的名稱。一個選擇器本身不做任何事情。它簡單地識別了一種方法。唯一使選擇器的方法名稱不同於普通字串,編譯器確保選擇器是獨特的。

iOS開發一些常見的警告解決方案(更新中。。。)

Unknown pattern color for the Background Color attribute 1.背景色屬性為未知模式的顏色 解決:預設xib裡面控制元件的背景色為Default。如果出現警告,可能是你定義的顏色Xcode啟動

iOS開發UIWebView載入html時不顯示網路圖片解決辦法

NSString *html = @"<html><body><p>怎麼顯示網路圖片 <img src=\"http://p0.ifengimg.com/pmop/2017/1218/F9636BB16CC72EC34B5FCB78

APP內開啟另一個APP(URL Scheme與openURL)iOS開發

目標 平常我們做iOS開發,會經常遇到開啟其他的APP的功能。本篇文章講的就是開啟別人的APP的一些知識。我們的目標是: 開啟別人的APP讓別人開啟我們的APPiOS9的適配問題使用URL Schemes傳遞資料 準備工作 建立一個名為OpenApp的工作空間,用來存放

iOS開發陣列的去重(無序和有序)

一、 無序的去重 1.利用NSDictionary的AllKeys(AllValues)方法 可以將NSArray中的元素存入一個字典,然後利用AllKeys或者AllValues取得字典的所有鍵或值,這些鍵或值都是去重的。 程式碼:

iOS開發---- tableView背景隨表滾動

        最近專案中用到了“圖隨表動”,如下圖所示:         這是一個訂單,需要add shipping insurance以上的部分隨著表格的滾動而滾動,這裡表格是group型別的,所以背景加在cell上是達不到效果的,在code4App上找到了一個例子(

iOS開發---- 語音識別

        最近iOS專案中需要用到語音識別技術(也被稱為自動語音識別,英語:Automatic Speech Recognition, ASR)。去google搜尋了一下,發現語音識別做的不錯的

iOS開發UIView(包括子類)的幾個初始化方法

-(id)initWithFrame:(CGRect)frame UIView的指定初始化方法; 總是傳送給UIView去初始化, 除非是從一個nib檔案中載入的; -(id

iOS開發NSThread

 atomic    原子屬性,是預設屬性     * 是在多執行緒開發時,保證多個執行緒在"寫入"的時候,能夠保證只有一條執行緒執行寫入操作!     * 是一個單(執行緒)寫多(執行緒)讀的多執行緒技術     * 原子屬性,解決不了賣票問題,因為賣票的讀寫都需要鎖定

iOS開發launch Images啟動圖片設定(UILaunchImageFile)之002

一、實現效果: 通過直接給圖片起預設的名字,讓app啟動頁自動載入啟動圖片。 二、注意點: ·圖片命名一定要按蘋果官方的指定規則命名,圖片的畫素也要符合規則; ·如果橫豎屏圖片都需要,記得在Xcode中勾選上專案支援橫豎屏。 三、官方描述:

iOS 開發將自己的框架打包成 Framework 的方法

建立 Framework 工程1. 建立打包工程開啟 Xcode 新建一個工程,選擇 Framework & Libray 選項中的 Cocoa Touch Framework ,這裡說一下我的 Xcode 版本是 8.3.2 。建立工程因為要打包所需的檔案,所以這裡我自己建立了一個測試類,在實際的打

iOS開發 常遇到的Crash和Bug處理

七:pngcrush caught libpng error,Not a PNG file Could not find file While reading /XXX/XXX/XXX/img1.png pngcrush caught libpng error:   Not a PNG filCou

iOS開發---- 手把手教你github託管程式碼

       在csdn上還有一篇介紹如何使用github託管程式碼的: 兩分鐘學會在GitHub託管程式碼。我照著這個教程嘗試了一遍,發現程式碼並沒有託管上去,只是建立了一個存放程式碼的倉庫(re

iOS 開發Status Bar 狀態列設定彙總

狀態列 個人覺得 iOS 的 Status Bar 狀態列也是一個比較坑的地方,所以還是寫一個總結,有遇到這方面問題的朋友可以看一下。 Status Bar 狀態列的隱藏 1. 通過設定 Info.plist 檔案實現狀態列的全域性隱藏 在 Info.pl

iOS開發---- 快速將大圖儲存到本地

       碰到一個問題:如何快速的批量儲存iphone相簿中的圖片(原始的大圖,解析度高)到本地? 儲存圖片到本地,首先得拿到這個圖片:alAsset.defaultRepresentation.fullResolutionImage.但是圖片太大了,大批量的儲存取這個