国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

初學者必學文檔:Objective-C語法入門

移動開發 iOS
Objective-C語法入門是本文要介紹的內容,Objective-C是Mac軟件開發領域最主要的開發語言。假如我們對面向對象的思維已經C語言都很熟悉的話,對于我們學習Objective-C將會非常有用。

Objective-C語法入門是本文要介紹的內容,Objective-C是Mac軟件開發領域最主要的開發語言。假如我們對面向對象的思維已經C語言都很熟悉的話,對于我們學習Objective-C將會非常有用。假如我們對C語言還不熟悉的話,那我們需要學習一下C語言。

方法調用(Calling Methods)

為了能夠盡快上手,我們先來看一些簡單的例子。Objective-C語法里面基本的方法調用是這樣的:

程序代碼:

  1.   [object method];  
  2.   [object methodWithInput:input]; 

對象的方法可以返回值:

程序代碼:

  1.   output = [object methodWithOutput];  
  2.   output = [object methodWithInputAndOutput:input]; 

我們也可以在類里面調用如何創建對象的方法。下面的這個例子里面,我們調用了NSString類的string方法:

  1.   id myObject = [NSString string]; 

id的類型意味著myObject這個變量可以指向任意類型的變量。當我們編譯這個應用程序的時候,并不知道他實現的真實的類和方法。

在這個例子里面,很明顯這個對象的類型應該是NSString,所以我們可以改一下他的類型 

  1.   NSString* myString = [NSString string]; 

現在myString就是一個NSString類型的變量。這個時候假如我們試圖使用一個NSString沒有實現的方法時,編譯器就會警告我們。

一定要注意在對象類型的右邊有一個星號。所有的Objective-C對象變量都是指針類型的。id類型已經預先被定義成一個指針類型了。所以我們不需要再加星號。

嵌套消息調用(Nested Messages)

在許多編程語言里面嵌套消息,或者嵌套函數看起來就像這樣:

  1. function1 ( function2() ); 

function2的返回值被傳遞給function1當輸入參數。在Objective-C里面,嵌套消息調用就像這樣:

  1. [NSString stringWithFormat:[prefs format]]; 

我們應該盡量避免在一行代碼里面嵌套調用超過兩個。因為這樣的話,代碼的可讀性就不太好。

多參輸入的方法(Multi-Input Methods)

多個輸入參數的方法。在Objective-C里面,一個方法名可以被分割成幾段。在頭文件里面,就應該這樣子來定義一個多輸入參數的方法:

  1. -(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile; 

我們這樣來調用它:

  1. BOOL result = [myData writeToFile:@"/tmp/log.txt" atomically:NO]; 

參數不一定要給它命名。在運行期系統里面這個方法真實的名字叫writeToFile:atomically:。
 
 

  1. Accessors(Getter & Setter) 

在Objective-C里面所有的實例對象默認都是私有的。所有在大多數情況下我們需要用accessors去讀取或者設置變量的值。有兩個語法都支持這樣的操作,這個時傳統的老的語法:

  1. [photo setCaption:@"Day at the Beach"];  
  2. output = [photo caption]; 

第二行的代碼其實并非直接去讀對象實例的變量。事實上它調用的是名叫caption的方法。在Objective-C里大多數情況下我們不需要給getters加get的前綴。

無論什么時候我們見到方括號,其實我們都是向一個對象或者一個類發送了一個消息。

  1. Dot Syntax 

在bjective-C 2.0里面,新增加了一個"."操作的語法。在Mac OS X 10.5里面就使用了Objective-C 2.0語法:

  1. photo.caption = @"Day at the Beach";  
  2. output = photo.caption; 

我們兩種方式都可以使用。但是在一個工程里面最好保持風格一致,只使用某一種。"."操作只能夠被使用在setters和getters里面,而不能用在一般意思的方法上。

#p#

創建對象

主要有兩種方式來創建一個對象。第一種辦法像這面這樣:

  1. NSString* myString = [NSString string]; 

這是一種非常習慣性的風格。在這種方式情況下,我們創建的是系統自動釋放(autoreleased)類型的對象。關于自動釋放類型autoreleased,我們以后會深入討論一下。然而在許多情況下,我們需要手動的去創建對象:

  1. NSString* myString = [[NSString alloc] init]; 

這是一個嵌套的方法調用。第一個調用的NSString自己的alloc方法。這是一個相對比較底層的調用,因為他創建了內容,以及實例化了一個對象。

第二塊代碼調用了新創建對象的init方法。這個init方法實現了比較常用的基本設置,比如創建實例對象的參數。對于一般開發人員而言,實現這個客戶的類的具體的細節并不清楚。

在一些情況下,我們可以用不通的初始化方式去賦初值:

  1. NSNumber* value = [[NSNumber alloc] initWithFloat:1.0]; 

基本的內存管理

假如我們正在為Mac OS X開發一個應用程序,我們可以選擇是否啟用垃圾回收機制。這就意味著我們不需要去考慮內存管理,除了一個特別復雜的情形我們需要處理一下。

然而,我們有的時候我們的開發環境沒有垃圾回收機制,比如iPhone開發的時候就沒有垃圾回收機制。在這種情況下,我們就需要了解一些基本的內存管理方面的概念。

假如我們手動的通過alloc創建了一個對象,我們需要用完這個對象后release它。我們不需要手動的去release一個autoreleased類型的對象,假如真的這樣去做的話,我們的應用程序將會crash。

這里有兩個例子:

程序代碼:

  1.   // string1 will be released automatically  
  2.   NSString* string1 = [NSString string];  
  3.   // must release this when done  
  4.   NSString* string2 = [[NSString alloc] init];  
  5.   [string2 release]; 

就這個教程而言,我們可以人為autoreleased對象會在當前函數方法調用完成后被釋放。

當然了,還有很多關于內存管理的只是我們需要學習,但是這需要我們了解更多的基本概念以后才能去涉及。

設計一個類的Interface

就Objective-C語言而言,創建一個類非常簡單。它非常典型的分成了兩個部分。

類的接口通常保存在ClassName.h文件里,它定義了實例的參數,以及一些公開的方法。

類的實現在ClassName.m文件里。它包含了真正運行的代碼和那些方法。它還經常定義一些私有的方法。這些私有的方法對于子類是不可見的。

這里有一個接口文件的大概。類名Photo,所以文件名叫Photo.h:

程序代碼:

  1.   #import  
  2.   @interface Photo : NSObject {  
  3.   NSString* caption;  
  4.   NSString* photographer;  
  5.   }  
  6.   @end 

首先,我們把Cocoa.h import進來。Cocoa的應用程序的所有的基本的類大多都是這樣做的。#import宏指令會自動的避免把同一個文件包含多次。

@interface符號表明這是Photo類的聲明。冒號指定了父類。上面這個例子父類就是NSObject。

在大括弧里面,有兩個變量:caption和photographer。兩個都是NSString類型的。當然了,他們也可以是任何別的類型包括id類型的。

最后@end結束整個聲明。

增加方法

讓我們為成員變量加一些getters:

程序代碼:

  1.   #import  
  2.   @interface Photo : NSObject {  
  3.   NSString* caption;  
  4.   NSString* photographer;  
  5.   }  
  6.   - caption;  
  7.   - photographer;  
  8.   @end 

別忘記,Objective-C方法不需要加get前綴。一個單獨小橫桿表明它是一個實例的方法。假如是一個加號的話,那就說明它是一個類的方法。

編譯器默認的方法的返回類型為id。還有所有的方法的參數的默認類型也都是id類型的。所以上面的代碼從技術上講是對的。但是很少這么用。我們還是給它加上返回類型吧:

程序代碼:

  1.   #import  
  2.   @interface Photo : NSObject {  
  3.   NSString* caption;  
  4.   NSString* photographer;  
  5.   }  
  6.   - (NSString*) caption;  
  7.   - (NSString*) photographer;  
  8.   @end 

下面我們再加上setters:

程序代碼:

  1.   #import  
  2.   @interface Photo : NSObject {  
  3.   NSString* caption;  
  4.   NSString* photographer;  
  5.   }  
  6.   - (NSString*) caption;  
  7.   - (NSString*) photographer;  
  8.   - (void) setCaption: (NSString*)input;  
  9.   - (void) setPhotographer: (NSString*)input;  
  10.   @end 

Setters不需要返回任何值,所以我們把它的類型指定為void.

#p#

類的實現

我們通過實現getters來創建一個類的實現:

程序代碼:

  1.     #import "Photo.h"  
  2.   @implementation Photo  
  3.   - (NSString*) caption {  
  4.   return caption;  
  5.   }  
  6.   - (NSString*) photographer {  
  7.   return photographer;  
  8.   }  
  9.   @end 

這部分的代碼由@implementation再來加上類名開始,以@end結束。就跟類的接口定義一樣,所有的方法跟接口定義里的一樣。所有的對象都必要既要定義也要實現。

假如我們以前也寫過代碼的話,Objective-C里面的getters看上去跟別的差不多。所以我們下面就來介紹setters,它需要一點說明。

程序代碼:

  1.   - (void) setCaption: (NSString*)input  
  2.   {  
  3.   [caption autorelease];  
  4.   caption = [input retain];  
  5.   }  
  6.   - (void) setPhotographer: (NSString*)input  
  7.   {  
  8.   [photographer autorelease];  
  9.   photographer = [input retain];  
  10.   } 

每個setter處理兩個變量。第一個是當前存在對象的應用。第二個是新的輸入對象。在支持垃圾回收的開發環境里,我們只要直接賦新值就可以了:

程序代碼:

  1.   - (void) setCaption: (NSString*)input {  
  2.   caption = input;  
  3.   } 

但是假如我們不可以用垃圾回收機制的話,我們就需要先retain舊的對象,然后retain新的對象。

有兩種方法可以釋放一個引用對象:release 和 autorelease。標準的release會直接刪除引用。autorelease方法會在將來的某個時候去release它。在它聲明周期結束前,它會毫無疑問的存在。在本例中,上面setPhotographer中的photographer對象,將會在函數結束的時候被釋放。

在setter里面用autorelease是安全的,因為新對象跟老的對象有可能是同一個對象有可能指向的是同一個對象。對于一個我們即將retain的對象,我們不應該立即release它。

這個也許現在看起來會困惑,但是隨著我們的學習,會越來越能理解它。現在我們不需要立刻完全理解它。

初始化

我們可以創建一個初始化方法去給類的實例的成員變量賦初值:

程序代碼:

  1.   - (id) init  
  2.   {  
  3.   if ( self = [super init] )  
  4.   {  
  5.   [self setCaption:@"Default Caption"];  
  6.   [self setPhotographer:@"Default Photographer"];  
  7.   }  
  8.   return self; 

  

上面的代碼感覺沒啥好解釋的,雖然第二行代碼好像看上去沒啥用。這個是一個單等于號,就是把[super init]的值賦給了self。

它基本上是在調用父類去實現它的初始化。這個if代碼段是設置默認值之前驗證初始化是否成功。

釋放資源Dealloc

這個dealloc方法是在當一個對象希望被從內容里面刪除的時候調用。這個我們釋放在子類里面引用成員變量的最好的時機:

程序代碼:

  1.   - (void) dealloc  
  2.   {  
  3.   [caption release];  
  4.   [photographer release];  
  5.   [super dealloc];  
  6.   } 

開始兩行我們發送了release通知給了兩個成員變量。我們不要在這里用autorelease。用標準的release更快一點。

最后一行的[super dealloc];非常重要。我們必須要發送消息去讓父類清除它自己。假如不這么做的話,這個對象其實沒有被清除干凈,存在內存泄露。

dealloc在垃圾回收機制下不會被調用到。取而代之的是,我們需要實現finalize方法。

  1. More on Memory Management 

Objective-C的內存管理系統基于引用記數。所有我們需要關心的就是跟蹤我們引用,以及在運行期內是否真的釋放了內存。

用最簡單的術語來解釋,當我們alloc一個對象的時候,應該在某個時候retain了它。每次我們調用了alloc或者retain之后,我們都必須要調用release。

///// 。。。圖。。。。

這就是引用記數理論。但是在實踐的時候,只有兩種情況我們需要創建一個對象:

1. 成為一個類的成員變量

2. 只臨時的在一個函數里面被使用

在更多的時候,一個成員變量的setter應該僅僅autorelease舊的對象,然后retain新的對象。我們只需要在dealloc的時候調用release就可以了。

所以真正需要做的就是管理函數內部的local的引用。唯一的原則就是:假如我們alloc或者copy了一個對象,那么我們在函數結束的時候需要release或者autorelease它。假如我們是通過別的方式創建的,就不管。

這里是管理成員對象的例子:

程序代碼:

  1.   - (void) setTotalAmount: (NSNumber*)input  
  2.   {  
  3.   [totalAmount autorelease];  
  4.   totalAmount = [input retain];  
  5.   }  
  6.   - (void) dealloc  
  7.   {  
  8.   [totalAmount release];  
  9.   [super dealloc];  
  10.   } 

這里是本地引用的例子。我們只需要release我們用alloc創建的對象:

程序代碼:

  1.   NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
  2.   NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
  3.   // only release value1, not value2  
  4.   [value1 release]; 

這里是用本地引用對象去設一個成員變量的例子:

程序代碼:

  1.   NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
  2.   [self setTotal:value1];  
  3.   NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
  4.   [self setTotal:value2];  
  5.   [value1 release]; 

注意到如何管理本地引用其實都是一樣的。不管你是否把它設給了一個成員變量。我們無須考慮setters的內部實現。

如果我們很好的理解了這些的話,我們基本上理解了80%的Objective-C內存管理方面的內容了。

小結:初學者必學文檔:Objective-C語法入門的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-08-17 12:03:36

Objective-C

2011-08-05 14:16:47

Objective-C 變量 方法

2011-08-12 10:27:52

Objective-C對象

2011-08-10 19:01:18

Objective-C

2011-08-01 11:49:05

Objective-C

2010-11-04 16:32:00

Objective-C

2023-10-14 17:21:53

Scala編程

2011-08-11 10:50:08

xcode調試文件

2011-05-11 15:58:34

Objective-C

2011-08-02 13:16:36

Objective-C 語法 函數

2011-05-11 13:54:08

Objective-C

2011-09-08 10:38:37

Widget

2014-04-30 10:16:04

Objective-CiOS語法

2011-07-26 16:08:40

iPhone 應用程序

2020-09-06 08:19:11

Python編程語言開發

2011-07-18 16:36:51

Objective-C XCode

2020-08-16 13:10:46

TensorFlow深度學習數據集

2011-08-24 17:05:01

Lua

2021-08-05 14:40:45

操作系統UNIXLINUX

2024-08-20 00:00:08

點贊
收藏

51CTO技術棧公眾號

国产午夜一区| 是的av在线| 99理论电影网| 国产精品成人3p一区二区三区 | 国产寡妇亲子伦一区二区| 91精品国产丝袜白色高跟鞋| 精品国内产的精品视频在线观看| 久久不射影院| 可以看毛片的网址| 欧美福利网址| 国产精品成熟老女人| 国内精品视频| 中文字幕亚洲一区| 阿v视频在线| 欧美大片一区二区| 在线观看av黄网站永久| 色94色欧美sute亚洲线路一久| 天堂在线看视频| 亚洲精品国产无天堂网2021| 成人狠狠色综合| 国产欧美精品一区| 北条麻妃在线一区| 欧美国产一区二区| 99爱视频在线| 国产日韩欧美精品在线| 日韩福利视频在线| 国产精品福利电影一区二区三区四区| 亚洲精品一二三四五区| 亚洲国产岛国毛片在线| 成人在线电影网| 亚洲成人7777| 成年人视频网站在线| 这里只有精品电影| 国产精品一二三产区| 亚洲精品视频免费在线观看| www成人在线视频| 欧美成人四级hd版| 女人抽搐喷水高潮国产精品| 日韩av理论片| 一本到12不卡视频在线dvd| 国产精品一级久久久| 91精品网站| 亚洲国产精品综合久久久| 91在线视频九色| 国产精品最新自拍| 精品日韩在线播放| 国产欧美日韩不卡免费| 国产在线制服美女| 欧美一区二区三区在线观看| 成人在线爆射| 国产精品v日韩精品| 欧美视频成人| 一本一道久久a久久精品综合| 国产999精品久久| 性生活免费在线观看| 色一情一乱一乱一91av| rebdb初裸写真在线观看| 日韩小视频网址| 日韩电影免费网站| 欧美自拍资源在线| 国产精品久久久久久久浪潮网站| 欧洲一区av| 最近2019年中文视频免费在线观看| 日韩动漫一区| 欧美亚洲免费在线| 国产精品久久久久久久久久久免费看 | 亚洲警察之高压线| 国产精品久久久久久久久久三级 | 91精品国产色综合| 亚洲欧美久久久| 日本女优爱爱视频| 色婷婷综合激情| 精品视频在线一区二区在线| 国产精品久久久久一区二区| 久久97超碰色| 制服丝袜中文字幕在线观看| 日韩精品一区二区在线| 欧美尿孔扩张虐视频| 欧美性大战久久久久| 中文字幕中文乱码欧美一区二区| 成人影院www在线观看| 国内精品久久久久久影视8| 亚洲综合好骚| 二区三区中文字幕| 亚洲性视频网站| 精品二区视频| 3d黄动漫网站| 亚洲欧美制服另类日韩| 欧美特黄a级高清免费大片a级| 日韩欧美视频网站| 欧美一区二区三区在线视频| aiai久久| 日本乱理伦在线| 一区二区三区日本| 二区三区不卡| 99国精产品一二二线| 久久久精品中文字幕麻豆发布| 在线播放日本| 国产精品99久久久久久久久久久久| 蜜桃在线一区二区三区| 导航福利在线| 久久久久久久久久国产| 国产一区在线精品| 成人黄色网址| 成人在线资源网址| 亚洲一区二区三区国产| 伊人久久大香| 日韩不卡视频一区二区| 欧美精品黑人性xxxx| 成人同人动漫免费观看| 久久久久久久久久久久久国产精品| 日韩欧美综合在线| 亚洲福利久久| 最近最新中文字幕在线| 久久久久久国产精品三级玉女聊斋| 国产精品综合在线视频| 黄色网址在线免费| 亚洲最大av在线| 亚洲第一福利视频在线| 欧美自拍一区| 成人黄色激情网站| 欧美成人免费网| 成人v精品蜜桃久久一区| 免费看男女www网站入口在线| 国内精品二区| 91福利在线观看| 欧美日本一区二区视频在线观看| 特黄特色大片免费视频大全| 欧美成人精品xxx| 成人深夜在线观看| 欧美激情啪啪| www.国产二区| 日韩av在线导航| 久草精品在线观看| 无遮挡爽大片在线观看视频| 中文字幕一区二区三区四区五区六区 | 秋霞av在线| 国产精品色悠悠| 亚洲成人一区二区在线观看| 日韩精品一卡| 九色蝌蚪在线| 久久影院理伦片| 欧美精品一区二区在线播放 | 亚洲精品**中文毛片| 日本三日本三级少妇三级66| 亚洲欧洲中文天堂| 97se亚洲国产综合自在线| 精品午夜视频| 在线观看国产一级片| 欧美一区二区三区免费视| 夜夜精品视频一区二区| 亚洲一区色图| 超碰在线网址| www亚洲国产| 国产一区二区视频在线播放| 天堂成人av| 日韩一级免费看| 欧美大胆在线视频| 亚洲人吸女人奶水| 先锋资源久久| 2024最新电影在线免费观看| 久久精品日产第一区二区三区| 337p日本欧洲亚洲大胆色噜噜| 三级成人在线视频| 黄色精品视频| 免费h片在线观看| 国产青春久久久国产毛片| 91精品国产综合久久久久久漫画 | 国产精品视频成人| 欧美日韩高清不卡| 国产精品99久久不卡二区| 亚洲精品一区在线| 邻居大乳一区二区三区| 日韩欧美亚洲在线| 色噜噜狠狠狠综合曰曰曰88av| 18成人在线观看| 国产精品啊啊啊| 日韩三级影视| 8×8x拔擦拔擦在线视频网站| 六月婷婷久久| 欧美黑人xxxx| 欧美三级中文字| www国产成人免费观看视频 深夜成人网 | 色哺乳xxxxhd奶水米仓惠香| 久久久久亚洲精品成人网小说| 欧美日韩中文字幕综合视频| 奇米四色…亚洲| 中文字幕精品影院| 波多野结衣中文在线| 91福利视频在线| 午夜亚洲性色福利视频| 成人在线视频观看| 色中色在线视频| 欧美啪啪免费视频| 3d动漫精品啪啪一区二区三区免费| 亚洲美女视频网| 天天色图综合网| www.欧美精品一二区| 伊人久久成人| 国产图片一区|