亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

objective-c語法快速過(1)

2019-11-14 19:31:19
字體:
來源:轉載
供稿:網友

有一定 c++或者 java 基礎,過一遍 oc 語法即可,都是相通的,個人認為難點是 oc 的內存管理,雖然有了 ARC,但是也需要學習下,因為有舊軟件的維護。

建立在C語言的基礎上,增加了一層小范圍的面向對象的語法(保留了面向對象最精華的部分,oc的內容沒有java多,而java的內容沒有c++多,c++的內容最為繁雜),OC完全兼容C語言,c和oc可以混編??梢栽贠C代碼中混入C語言代碼(前提是oc源文件擴展名是.m),甚至是C++代碼(不是所有的源文件都能包含c++代碼,只有源文件擴展名是.mm的源文件可以包含c++代碼)。

可以使用OC開發Mac OS X平臺和iOS平臺的應用程序

關鍵字

基本上所有關鍵字都是以@開頭,一些常見的關鍵字

@interface、@implementation、@end、@public、@PRotected、@private、@selector、@try、@catch、@throw、@finally 、@protocol、@optional、@required、@class、@property、@synthesize、@dynamic、self、super、id、_cmd、__block、__strong、__weak

字符串以@開頭

比如@"Hello"是OC中的字符串,而"Hello"則是C語言中的字符串,其中,@和字符串必須緊挨著。

注釋

注釋的語法和C 一樣。

nil

OC 中的 nil 相當于 c 和 c++的NULL 

OC程序的開發過程

編輯,編譯,鏈接(把所有的相互關聯的.o文件合并在一起,加上函數庫),運行。

和c類似,先編寫.m文件(文件名可以是中文),然后編譯器編譯,鏈接,運行。

 

NSLog與printf的區別

1、NSLog接收OC字符串作為參數,printf接收C語言字符串作為參數

2、NSLog輸出后會自動換行,printf輸出后不會自動換行

3、使用NSLog需要#import <Foundation/Foundation.h>,里面有NSLog函數的聲明。不需要刻意記憶,想不起來,就編譯,出錯就會提示缺少什么。

4、可以只包含框架的主頭文件,效果等價包含了這個框架里的所有的頭文件。頭文件在Xcode里面,路徑很深,不好找。使用printf需要#include <stdio.h>

#import的作用(預處理)

1、跟#include一樣,用來拷貝某個文件的內容

2、可以自動防止文件內容被拷貝多次,也就是頭文件中不用和C一樣,加入下面的預處理指令了

#ifndef  xxx xxx#define xxx xxx#endif

Foundation框架的作用

開發iOS、Mac程序必備的框架,此框架中包含了很多常用的API??蚣苤邪撕芏囝^文件,若想使用整個框架的內容,包含它的主頭文件即可

#import <Foundation/Foundation.h>

相當于#include 導入頭文件 也有兩種查找方式< ... > 和" ... "。

當包含一個頭文件,編譯時,需要找到那個頭文件,使用< >這種方式,編譯器查找的時候,會在編譯器的安裝目錄的標準庫中開始查找," "這種方式,會在當前的工程所在的文件夾開始尋找,也就是源程序所在的文件夾。有的編譯器,要求十分嚴格,不能混用,有的就可以。

BOOL的使用(完全可以當做整型用)

BOOL類型的本質:

typedef signed char BOOL;

BOOL類型的變量只有兩種取值:YES、NO

#define YES (BOOL)1#define NO  (BOOL)0

BOOL的輸出(當做整數來用);

NSLog(@"%d %d", YES, NO);//1 0

C里沒有布爾類型,c++,java里有,oc也有。不過oc的布爾和c++有區別,在C++里一切非 0 值的東西都為 true,而為0值的為false。但是Object-c里必須是1為 true ,且并被宏定義為 YES,0 為 false 并被宏定義為 NO。

所以下面的代碼,則肯定是得不到想要的運行順序。

復制代碼
 1 #import <Foundation/Foundation.h> 2 BOOL isBool(int, int); 3  4 int main(void) 5 { 6     if (isBool(5, 1) == YES) { 7         NSLog(@"ok"); 8     } 9     return 0;10 }11 BOOL isBool(int x, int y)12 {13     return x - y;14 }
復制代碼

4不是1,在oc里永遠都不會等于YES(因為 oc 中的YES就是1),注意:BOOL大寫,YES 和 NO 也是大寫,OC 里的YES就是1,NO就是0

多個.m文件的開發和混合開發

跟C語言中多文件的開發是一樣的,回憶c多文件開發,常量的定義或者函數的聲明寫在xxx.h文件,函數的定義寫在xxx.c文件,主文件main.c里寫主程序和函數調用,最后#include xxx.h文件,一起編譯主文件main.c和xxx.c文件即可。

面向對象常用術語

  • 面向過程 Procedure Oriented
  • 面向對象 Object Oriented,簡稱OO
  • 面向對象編程 Object Oriented Programming,簡稱OOP

OC中的面相對象

1)       類相當于圖紙,用來描述一類事物。

2)       利用類來創建對象,對象是類的具體存在

3)       因此,面向對象解決問題應該是先考慮需要設計哪些類,再利用類創建多少個對象 

定義OC的類和創建OC的對象

定義一個新類分為 2 部分:

@interface 部分;

描述類、類的數據成分以及類的方法

@implementation 部分;

實現這些方法的實際代碼

 

@interface 部分的一般格式:

@interface NewClassName : ParentClassName{memberDeclarations;}methoddeclarations;@end 

@implementation 部分的一般格式:

@implementation NewClassNamemethodDefinitions;
@end//NewClassName 表示的名稱與@interface 部分的類名相同

要描述類分2大步驟:類的聲明、類的實現(定義)。

跟函數類似,函數也分聲明和定義。而聲明一個類又需要三大要素:類名,屬性,行為,類似 c++。

命名規則:

以字母或下劃線開頭,之后可以是任何字母,下劃線或者0~9 數字組合。

約定:

類名以大寫字母開頭,命名有意義、比如駝峰標識。

實例變量、對象以及方法的名稱以小寫字母開始。每次創建新對象時,將同時創建一組新的實例變量且唯一。

注意:在對象類型的右邊都有一個 *號,所有的對象變量都是指針類型。

id (萬能指針)類型已經被預定義為指針類型,所以不需要加一個*號。 

  • 類的聲明,關鍵字@interface后一個空格,跟一個類名,然后最后必須寫@end,告訴編譯器類聲明完畢
  • 類的聲明用來聲明對象的屬性(成員變量,也叫實例變量)和行為(方法)
  • : NSObject 繼承一個類(在Foundation框架里)
  • 花括號里用來寫對象屬性,不能寫方法
  • 方法(行為);寫在花括號外,@end 前
    三要素:方法名,參數,返回值(類似函數,分聲明和實現),方法的聲明在類的聲明里,且不能寫在花括號里。
    方法雖然類似c的函數,但是和函數千差萬別
    只要方法是對象的方法,則聲明前必須加一個減號-,這是規則!
    oc方法里的任何數據類型都必須用小括號()括起來
    oc方法的小括號就一個作用,就是括住數據類型的。故- (void) run();是不對的!
  • 類的實現,類似于類的聲明語法,也要寫@end
  • 對象里的成員變量,可以取值整型的,那么默認初始化為0
  • oc方法的實現,必須寫在類的實現里,說清楚方法里有什么。

方法開頭的(-)號或者(+)號表示:
(-) 該方法是實例方法(對類的特定實例執行一些操作) ;

(+)是類方法(即對類本身執行某些操作的方法,例如創建類的新實例) 

oc 一般的方法的聲明示例:

-(void)setNumerator :(int)n

第一個表示方法類型(對象方法-),返回類型(空void),接著是方法名(包括冒號:),方法接受的參數類型int和參數名n

注:如果不帶參數則不用使用“:”號

如果沒有指定任何返回類型, 那么默認是id類型, 所有的輸入參數默認也是id類型 (id類型可用來引用任何類型的對象,屬于萬能指針類型) 。

 oc 里具有多個參數的方法聲明示例:

-/+ (return type) function_name : (parameter type) parameter1 otherParameter : (parameter_type) parameter2;

如果只有一個參數,在: 后面聲明參數的類型和名稱

如果有多個參數的話,每個參數前面都要有一 個 :,接著是參數類型和參數名稱。

在 objective c 中,對于有多個參數的函數,可以理解為將函數的名稱拆 成了幾個部分,每個部分都是對緊接著的參數的一個解釋 ,非常方便,做到見名知意,oc 官方文檔也是,尤其帶多個參數的方法名字往往特別的長。

如在 C++中多個參數的方法聲明:

void initializeRectangle(int x1, int y1, int x2, int y2); 

但并不知道這些參數都是什么意思,但在objective-c 中,可以這樣聲明:

void initializeRectange: (int)x1 LeftUpY :(int)y1 RightBottomX: (int)x2 RightBottomY:(int)y2; 

利用類創建對象

oc里,想執行一些行為,必須寫上一個中括號[],方括號左面是類的名稱或者該類實例的名稱,空格后面是方法(即消息) 

[classOrInstance method];
執行Car這個類的new行為來創建對象,分配了內存,每個對象都有自己的存儲空間來存儲自己的成員變量等元素
youCar = [Car new];//創建了一個Car類的對象,返回對象的地址(返回對象)。之后內存里存在這個對象了。
oc里想操作對象,只能用指針去間接操作!
Car *p = [Car new];//把地址保存到指針里,p指向的是Car類型的對象
給p指向的對象的屬性賦值
 p->speed = 200;

內存分析(對象在內存中有成員)

[Car new]每次都會創建出新的對象,并且返回對象的地址,那么就應該用一個指針變量保存對象的地址

Car *c = [Car new];//用一個指針變量c指向內存中的Car對象     

設置車子對象的屬性,跟用指向結構體的指針訪問結構體屬性一樣,用->

c->wheels = 3;

c->speed = 300;

對象在內存里的變化和狀態圖

oc 類成員的訪問屬性:

oc類屬性,默認是@protected,本類內部和繼承的類能訪問,而外部無法訪問,需要手動設置為public。

@pubic

有一個典型的錯誤

oc千萬不能想當然的和c++,java混淆,不用在類實現里再添加花括號了,直接寫方法的實現即可。

 和c++的不同,oc的類占據一份內存空間!

在第一次使用類的時候,類被加載到內存里,即在創建對象之前,先給類分配內存空間。

1、存放類的內存只被加載一次(第一次使用對象的時候,加載對象屬于的類)即可,且里面只存放方法的列表。

2、內存里每個類的對象的存儲空間內部,默認都有一個指針叫isa指針,每個對象都有,作用是:指向這個對象所對應的類(存放類的內存塊,幫助找到對象所屬的類),所以所有的對象都共用一份方法,所以類只被加載一次即可。成員變量每個對象都有自己的那一份內存,但是方法就共用一份內存

3、調用方法的過程:

[person1 walk]; 

執行:

給指針person1指向的對象發送一條walk消息,去調用那個對象的walk方法,然后對象會順著isa指針找到對應的類,去類里找方法,找到walk方法,就前往對應的代碼去執行,就在walk方法里訪問當前對象的成員變量age和weight(因為成員變量,每個對象都有自己的一份

再次強調:將對象賦給id類型變量不會有問題。

注:無論在哪里,對象總是攜帶它的isa的保護成員(一個指針,可以用來確定對象所屬的類) ,所以即使將它存儲在id類型的通用對象變量中,也總是可以確定它的類 。

面向對象封裝的好處

  • 更加接近人類的思考方式
  • 只需要關注對象,不需要關注步驟 
  • 但是注意:oc的對象不會自動去回收,一旦創建,一直存在內存里,除非手動釋放,或者程序執行完畢。所以,函數創建的對象不會消失。但是沒有指向它的指針存在了。
  • 注意,oc 里,方法和函數是有本質的區別的,不要混淆!

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美a级成人黄色| 国内自拍欧美激情| 亚洲精品一区二区三区婷婷月| 欧美性猛交xxxx黑人猛交| 国产午夜精品视频| 日韩经典一区二区三区| 国产成人福利夜色影视| 亚洲亚裔videos黑人hd| 一区二区三区在线播放欧美| 国产91对白在线播放| 欧美激情视频一区二区三区不卡| 日韩在线视频免费观看| 成人黄色午夜影院| 中文字幕在线看视频国产欧美| 人人做人人澡人人爽欧美| 亚洲精品视频久久| 亚洲伊人久久大香线蕉av| 这里只有精品视频| 中文字幕最新精品| 俺去啦;欧美日韩| 亚洲欧美三级伦理| 欧美电影院免费观看| 国产亚洲精品高潮| 久久久久久一区二区三区| 国内精品久久影院| 欧美另类极品videosbest最新版本| 欧美成aaa人片免费看| 国产精品91久久久久久| 亚洲天堂av在线免费观看| 欧美日韩亚洲91| 亚洲黄在线观看| 综合av色偷偷网| 精品精品国产国产自在线| 亚洲精品国产精品国自产在线| 日韩免费精品视频| 色悠久久久久综合先锋影音下载| 欧美日韩综合视频网址| 欧美日韩国产精品一区二区三区四区| 亚洲热线99精品视频| 久久久极品av| 国产69久久精品成人看| 亚洲黄色www| 91热精品视频| 亚洲久久久久久久久久| 国产精品久久一区主播| 欧美放荡办公室videos4k| 亚洲xxxx妇黄裸体| 久久久免费电影| 亚洲人成免费电影| 国产日韩精品综合网站| 国产日韩换脸av一区在线观看| 日韩暖暖在线视频| 成人在线小视频| 国产精品视频yy9099| 国产欧美 在线欧美| 亚洲一区二区三区乱码aⅴ| 亚洲人成网站色ww在线| 国产日韩精品入口| 欧美视频免费在线观看| 在线播放日韩av| 国产欧美日韩91| 91精品国产自产91精品| 国产精品三级在线| 亚洲精品久久久久国产| 久久久视频免费观看| 欧美亚洲成人精品| 国产成人av在线播放| 2019精品视频| 岛国视频午夜一区免费在线观看| 日韩中文字幕免费| 久久影视电视剧免费网站| 日本免费一区二区三区视频观看| 91精品中文在线| 亚洲欧美国产另类| 欧美激情a∨在线视频播放| 亚洲精品一区二区三区不| 欧美激情视频在线免费观看 欧美视频免费一| 欧美肥婆姓交大片| 欧美一级大胆视频| 欧美午夜片欧美片在线观看| 亚洲网址你懂得| 久久成人这里只有精品| 国产成人精品视频在线观看| 91九色视频导航| 91视频免费在线| 欧美大片在线免费观看| 亚洲成**性毛茸茸| 亚洲日韩欧美视频| 亚洲精品日韩欧美| 国产精品日韩久久久久| 久久精品国产成人| 亚洲区免费影片| 欧美乱大交做爰xxxⅹ性3| 奇米四色中文综合久久| 欧美韩国理论所午夜片917电影| 久久成人精品视频| 国产精品美女视频网站| 九九热99久久久国产盗摄| 久久精品电影一区二区| 欧美性理论片在线观看片免费| 国产精品亚洲片夜色在线| 国产精品久久久久久久午夜| 在线视频欧美日韩| 夜夜嗨av一区二区三区四区| 欧美老女人xx| 美女999久久久精品视频| 国产欧美亚洲视频| 久久精品久久久久| 国产一区二区成人| 国产精品久久久久久久久久小说| 精品久久在线播放| 亚洲精品福利在线| 日本高清久久天堂| 91av视频在线观看| 国产精品精品一区二区三区午夜版| 成人黄色影片在线| 国产精品久久久久7777婷婷| 亚洲免费av网址| 日韩在线中文字| 国产视频久久久久| 蜜月aⅴ免费一区二区三区| 亚洲级视频在线观看免费1级| 国产精品白嫩初高中害羞小美女| 麻豆一区二区在线观看| 久久久久久91| 欧美成人精品不卡视频在线观看| 日韩av在线免费看| 国产精品露脸自拍| 国产丝袜一区视频在线观看| 亚洲精品成人av| 久热精品在线视频| 欧美激情亚洲另类| 日韩有码在线播放| 亚洲无限乱码一二三四麻| 久久精品视频在线| 久久天天躁狠狠躁夜夜躁| 日本久久亚洲电影| 精品伊人久久97| 精品免费在线观看| 自拍偷拍亚洲区| 人人爽久久涩噜噜噜网站| 国产精品成人在线| 亚洲自拍在线观看| 日韩中文字幕在线视频播放| 日本一欧美一欧美一亚洲视频| 国产精品成av人在线视午夜片| 国产精品午夜国产小视频| 亚洲精品免费网站| xvideos国产精品| 欧美亚洲午夜视频在线观看| 久99久在线视频| 亚洲性猛交xxxxwww| 日韩一区二区久久久| 国产精品爽黄69| 欧美精品久久久久久久久| 91午夜理伦私人影院| 亚洲人午夜精品免费| 色综合色综合久久综合频道88| 91中文在线视频| 国产精品旅馆在线| 国产精品高清免费在线观看| 91精品久久久久久久| 国产噜噜噜噜久久久久久久久| 亚洲毛片在线观看|