【IOS 開發】Object
.
一. 類定義
類定義需要實現兩部分 :
-- 介面部分 : 定義類的成員變數和方法, 方法是抽象的, 在標頭檔案中定義;
-- 實現部分 : 引入介面部分的標頭檔案, 實現抽象方法;
1. 介面部分定義
(1) 介面部分定義格式
介面部分定義格式 :
@interface className : superClassName
{
type _variableName;
... ...
}
- (type) methodName : type parameterName;
@end
-- 介面定義開始標識 : @interface 表示介面開始定義;
-- 介面定義結束標識 : @end 表示介面定義結束;
-- 介面名稱定義
-- 父類介面 : 如果有父類, 在介面名稱後面的 : 後寫出;
-- 成員變數定義 : 在 @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.但是圖片太大了,大批量的儲存取這個