objectivec是c語言
『壹』 objective-c與C++的區別
與c語言相比要注意的地方
objective-c高級特性
開發工具介紹(cocoa 工具包的功能,框架,源文件組織;XCode使用介紹)
簡介:
1. objective-c是C語言的一個擴展集,主要由APPLE公司維護,是MAC系統下的主要開發語言。
個人認為,對於用慣了常用的C,JAVA等語言的人來說,objective-c是一中很另類,非主流的語言。
2. 開發 Mac的 UI 程序來說,使用的是 Cocoa 這個框架,cocoa的組成部分有:foundation和application kit框架。
【foundation框架處理用戶界面之下的特性,如數據結構和通信機制;application kit框架包含cocoa的高級特性:用戶界面元素,列印,顏色,聲音管理,applescript等】
與C語言相比要注意的地方:
1. 文件介紹:Objective-C 也使用頭文件(header files),後綴為 .h, 但使用 .m(即 message, 其他面向對象編程語言也叫 method),作為源文件的後綴。
在objective-c中使用#import<>,而不使用#include<>,#import可以保證頭文件只被包含一次。
2. 與C一致的地方:
數據類型,表達式,各種運算符
循環:for, while, do while, break, continue
分支:if, else, switch
3. NSlog()函數:與printf()類似,想控制台輸出信息。但它增加了一些特性,如時間戳等。
【cocoa對起所有的函數,常量和類型名稱都添加了NS前綴。】
4. 雙引號的前面的@表示這雙引號中的字元串應該作為cocoa的NSString元素來處理。
5. 布爾類型BOOL:值為YES,NO;
6. %d表示輸出整數
%@表示輸出NSString類型
%s表示輸出字元串數組(char*);
7. objective-c中的方括弧:
1. 用於通知某個對象該做什麼。
2. 方括弧內第一項是對象,其餘部分是你需要對象執行的操作。
3. 在objective-c中通知對象執行某種操作,稱為發送消息。(也叫調用方法)
8. 標識符id:是一種泛型,用於表示任何種類的對象。
9. 類聲明@interface:
@interface Circle:NSObject //為Circle類定義介面;NSObject表示是父類。
{//以下是數據成員
ShapeColor fillColor;
ShapeRect bounds;
}
//以下是方法聲明
-(void) setFillColor: (ShapeColor) fillColor; //前面的短線表明這是方法聲明
//短線後面是方法的返回類型
//接著是方法名
//冒號後面是參數,其中(ShapeColor)是參數類型,
fillColor是參數名
-(void) setBounds:(ShapeRect) bounds;
-(void) draw;
//減號就是普通函數
加號就是靜態函數
@end //結束聲明
objective-c看到@符號,就把它看成是C語言的擴展。
一個類的完整聲明如下:
@interface CClassA(Category): CBaseClass<IA,IB...>
//類名(類別名):父類<協議>
10. 類實現@implementation
@implementation
@implementation Circle
-(void) setFillColor: (ShapeColor) c
{
fillColor=c;
}
-(void) draw
{
NSLog(@」drawing a circle at(%d %d %d %d) in %@」, bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillName));
}
@end
隱藏對象self對應於C中的this。
Self->fillcolor來訪問成員變數。
11. 調用寫好的類和類函數:
//創建新對象,使用預設初始化函數
Bank *bankDefault = [[Bank alloc] init];
//調用方法:
[bank addAmount: 1];
[bank print];
// 釋放對象:
[bankDefault free];
12.
兩個參數的方法:
-(void) setTire: (Tire *) tire //聲明
atIndex: (int) index;
//使用
[car setTire:tire atIndex:2];
objective-c高級特性:
1. 繼承
Objective-c不支持多繼承。
Super 關鍵字:調用該類的父類;
超類:父類的另一種說法。
2.
自定義NSLog()輸出:
在類中添加description方法就可以自定義NSLog()如何輸出對象。
@implementation Tire
-(NSString *) description
{
Return (@」I am a tire.」);
}
Main()
{
NSLog(@」%@」,tire[0]);
}
3.
Foundation kit:
Cocoa是由兩部分框架組成的:foundation kit [包括一些基礎類]和 application kit.【包括用戶介面對象和高級類】
創建字元串:
NSString *test;
test=[NSString stringWithFormat:@"i'm %d years old!",23];
若在聲明方法時在方法前面添加了加號,那就表示把這個方法定義為類方法【這個方法屬於類對象,而不是類的實例對象。】
NSArray類:可以存放任意類型的對象.
它有兩個限制:
1. 它只能存儲objective-c的對象,但不能存儲C中的基本數據類型,如int , float, enum, struct等。
2.不能存儲nil(對象的零值或NULL值);【因為在創建NSArray時,要在列表結尾添加nil代表列表結束。】
創建NSArray:
NSArray *array;
array=[NSArray arrayWithObjects:@"one",@"two",nil];
NSString, NSMutableString類;
【NSString是不可變的,即一旦創建完成,就不能通過刪除字元或添加字元的方式來改變它;
而NSMutableString是可變的。
這兩個類就像JAVA中的string與stringBuffer類的區別。】
NSArray, NSMutableArray類;
NSEnumerator枚舉;
【
NSEnumerator *emun;
Emun=[array objectEnumerator];
Id thingie;
While(thingie=[enumerator nextObject]){}
】
NSDictionary:字典(關鍵字及其定義的集合。)【也成為散列表,關聯數組】,NSMutableDictionary類;
NSNumber:用來包裝基本數據類型,如int ,char, float, bool;【將一個基本類型的數據包裝成對象叫做裝箱。】
NSValue:它可以包裝任何類,NSNumber是它的子類。
NSNull:
在cocoa中看到「CF」字樣時,就表示它是蘋果公司的Core Foundation 框架相關的內容。
NSAutoreleasePool:自動釋放內存池。
4.
內存管理
每個對象都有一個與之關聯的引用計數(也叫保留計數)
當使用alloc, new 方法或通過 消息(生成接收對象的一個副本)創建一個對象時,對象的引用計數值被設為1;
給對象發retain消息時,增加該值;
發送release消息時,減少該值;
當一個對象的引用計數值變為0時,objective-c會自動向對象發送一條dealloc消息。銷毀該對象。
你可以在自己的對象中重寫該方法,
使用retainCount消息,可以獲取引用計數器的值。
-(id) retain;
-(void) release;
-(unsigned) retainCount;
自動釋放池:autorelease pool;
創建:
NSAutoreleasePool *pool;
pool=[[NSAutoreleasePool alloc] init];
銷毀:
[pool release];
注意:xcode自動生成的代碼,銷毀pool池時,使用的是[pool drain],drain方法只是清空釋放池,但不銷毀pool.所以在自己編寫代碼時還是使用release.
而且,drain只適用於MAC OS 10.4以上的版本,而release適用於所有版本。
只有在向某個對象發送autorelease消息時,該對象才會添加到NSAutoreleasepool中,才會被自動釋放。
如:[car autorelease];
內存管理黃金准則:
只有通過alloc, new和 方法創建的對象,才需要程序員負責向該對象發送release或autorelease消息。
而通過其他方法獲得的對象,則默認為已經被設置為自動釋放,所以不需要程序員做任何操作了。
在objective-c 2.0中有垃圾回收機制,
如果要對某個項目使用垃圾回收:
項目信息--build選項卡--查詢"garb",出現「objective-c Garbage Collection」,將其值設置為「required[-fobjc-gc-only]」
啟用垃圾回收後,通常的內存管理命令全都變成了空操作指令,不執行任何操作。
開發iphone軟體,不能使用垃圾回收。
5.
對象初始化
兩種創建新對象的方法:
[類名 new]
[[類名 alloc] init]
這兩種方法是等價的,但cocoa的慣例是使用後者。
alloc在為對象分配空間的同時,將這塊內存初始化為0;
Init方法:初始化實例變數,使對象處於可用狀態。[返回類型為id, 返回的值描述了被初始化的對象]
使用new創建新對象時,系統要完成兩個步驟:
1. 為對象分配內存,即對象獲得一個用來存放其實例變數的內存塊;
2. 自動調用init方法,讓該對象處於可用狀態。
6.
objective-c 2.0的新特性【只適用於mac os x10.5及以上】
@property :表示聲明了對象的屬性。【這樣就不用再寫屬性的訪問器了。】
(他有, retain, readwrite, readonly等屬性)
@synthesize:表示「創建該屬性的訪問器」
點表達式
7.
類別
類別(category)是一種為現有的類添加新方法的方式。
類別的聲明:
@interface NSString (NumberConvenience) //類名 (類別名)
-(NSNumber) lengthAsNumber; //擴充方法聲明
@end
使用時使用原來的類名,就可以調用他的所有類別中的方法。
類別的局限性:
1. 不能向類中添加新的實例變數;
2. 在類別中的方法若與類中現有的方法重名,則類中的方法不可用,被類別中的新方法取代。
類別的作用:
1. 將類的實現分散到多個文件或框架中;
2. 創建對私有方法的前向引用;
【Cocoa中沒有真正的私有方法,則實現私有方法類似功能的方法為:
先在類別中聲明方法;然後到現有類的實現中實現該方法。
這樣這個類中的其他方法可以使用該方法,而其他外部的類就不會知道該方法的存在了。】
3. 向對象添加非正式協議。
【創建一個NSObject的類別稱為創建一個非正式協議。】
委託delegate是一種對象,另一個類的對象會要求委託對象執行它的某些操作。
受委託對象在某個時間(某個事件觸發)時,會自動通知委託對象執行委託方法。
選擇器:@selector():選擇器只是一個方法名稱,但它以objective-c運行時使用的特殊方式編碼,以快速執行查詢。圓括弧中的內容是方法名。
所以Car類的setEngine:方法的選擇器是:@selector(setEngine:
受委託對象如何知道其委託對象是否能處理它(受委託對象)發送給它(委託對象)的消息?
通過選擇器,受委託對象先檢查委託對象,詢問其是否能響應該選擇器。如果能,則向它發送消息。
8.
協議:
正式協議是一個命名的方法列表。
採用協議意味著必須實現該協議的所有方法。否則,編譯器會發出警告。
正式協議就像JAVA中的介面一樣。
聲明協議:
@protocal NSCopying
-(id) withzone:(NSZone *) zone; //方法列表
@end
採用協議:
@interface Car:NSObject <NSCopying,NSCoding> //中括弧中是要實現的協議列表
{//實例變數列表}
//方法列表
@end
在objective-c 2.0中,有新特性:@optional, @required
9.
AppKit:
創建APPKIT項目:
File—new project—mac os—application—Cocoa application;
IBOutlet與IBAction
這兩個都是APPKIT提供的#defines.
IBOutlet沒有任何作用,不會對它進行編譯。
IBAction定義為void。
這兩個是為Interface Builder以及閱讀代碼的人提供的標記。
.xib文件一般稱為.nib文件。
.nib文件是包含被凍結對象的二進制文件。
而.xib文件是XML格式的nib文件。
『貳』 Objective-C和C語言有什麼關系
Objective-C是C語言的嚴格超集。
任何C語言程序不經修改就可以直接通過Objective-C編譯器,在Objective-C中使用C語言代碼也是完全合法的。Objective-C被描述為蓋在C語言上的薄薄一層,因為Objective-C的原意就是在C語言主體上加入面向對象的特性。Objective-C的面向對象語法源於Smalltalk消息傳遞風格。所有其他非面向對象的語法,包括變數類型,預處理器,流程式控制制,函數聲明與調用皆與C語言完全一致。但有些C語言語法合法代碼在objective-c中表達的意思不一定相同,比如某些布爾表達式,在C語言中返回值為true,但在Objective-C若與yes直接相比較,函數將會出錯,因為在Objective-C中yes的值只表示為1。
『叄』 什麼是Objective-C語言
Objective-C語言是編寫iOS/Mac程序的主要語言。編寫iOS/Mac程序,除了Objective-C,還可以混合使用C/C++,另外也可以嵌入一些腳本語言。但在UI部分,使用Objective-C最為直接自然。
『肆』 object c 是c語言嗎
object-c通常寫作objective-c或者obj-c,是根據C語言所衍生出來的語言,繼承了C語言的特性,是擴充C的面向對象編程語言。它主要使用於Mac OS X和GNUstep這兩個使用OpenStep標準的系統,而在NeXTSTEP和OpenStep中它更是基本語言。Objective-C可以在gcc運作的系統寫和編譯,因為gcc含Objective-C的編譯器。在MAC OSX系統下,運用蘋果提供的SDK等開發工具包,可以用來做IOS開發,開發後的程序在Iphone虛擬機中進行測試,運用的主要語言為Object-c。與C#類似。Object-c僅支持單一父類繼承,不支持多重繼承。
『伍』 objective-c是什麼是c語言嗎
不是C語言,但是可以使用C語言的函數,相當於是對C語言擴充
『陸』 Objective-C和C的區別
區別如下:
1.性質不同
Objective-C,通常寫作ObjC或OC和較少用的Objective C或Obj-C,是擴充C的面向對象編程語言。C語言是一門面向過程、抽象化的通用程序設計語言,廣泛應用於底層開發。
2.特點不同
Objective-C是非常實用的語言。它是一個用C寫成很小的運行庫,令應用程序的尺寸增加很小,和大部分OO系統使用極大的VM執行時間會取代了整個系統的運作相反。C語言是一種結構化語言,它有著清晰的層次,可按照模塊的方式對程序進行編寫,十分有利於程序的調試,且c語言的處理和表現能力都非常的強大。
3.創始時間不同
Objective-C創始時間是1980年代,C語言創始時間是1972年。
『柒』 objective-c是c語言嗎
兼容C語言,也就是說,這種語言的語法里支持C語言的語法,並且,在此基礎上又擴展了面向對象的語法,也就是支持class,但是跟C++的class的語法差異較大。
以下是網路的定義:
objective-c是擴充C的面向對象編程語言。它主要使用於Mac OS X和GNUstep這兩個使用OpenStep標準的系統,而在NeXTSTEP和OpenStep中它更是基本語言。Objective-C可以在GCC以及Clang運作的系統上編寫和編譯,因為GCC與Clang含Objective-C的編譯器。
『捌』 【C語言】Objective-C 和 C++ 的區別有哪些
這東西跟c++有什麼本質區別?為什麼蘋果會選擇obj-c而不是c++? 答:Objective-C是C的擴展,設計思路上借鑒了Smalltalk的面向對象和消息機制的思想。從我個人使用過的面向對象語言來看Objc 是對消息傳遞支持的最徹底也最顯式的。Objective-C的類中定義的方法都是消息傳遞,而且類和消息之間是運行時綁定的,運行時編譯器把消息發送轉換成對objc_msgSend方法的調用。其它的C++、Java、Python、Ruby都體現的不明顯,更傾向於對象的封裝和抽象。 Objective-C和C++基本上是兩門語言,沒有太大的關系。Objective-C本身是靜態語言,編譯後就是機器碼,執行效率很高,但引入了很多類似Python、Ruby的動態特性,像動態類型推斷,id,selector,block等特性,所以又非常靈活。用慣了Java或C++會覺得Objective-C的語法很怪,但是把心放空再去學習這門語言的話,你會很快愛上它的消息式的編程風格,加上XCode,無論是寫mac應用還是 ios應用,都會非常得心應手。 學習Objective-C不需要有c的背景,倒是學Objective-C的時候順手可以把C也學了或溫習下,由於Objective-C是C的超集,所以在Objective-C環境執行C程序毫無問題。 關於蘋果為什麼採用Objective-C的問題,說明一下,其實不是蘋果採用了Objective-C,而是喬布斯創建的Next公司的操作系統 NextStep採用了Objective-C作為原生語言。NextStep是以Mach和BSD為基礎,Objective-C是其語言和運行庫,後來的事大家都清楚,蘋果買了NextStep,喬布斯回歸蘋果,NextStep也成了Max OS X的基礎。
『玖』 Objective - C和C語言的異同。
Objective-C,通常寫作ObjC和較少用的Objective C或Obj-C,是擴充C的面向對象編程語言。它主要使用於Mac OS X和GNUstep這兩個使用OpenStep標準的系統,而在NeXTSTEP和OpenStep中它更是基本語言。Objective-C可以在gcc運作的系統寫和編譯,因為gcc含Objective-C的編譯器。
1 歷史
1980年代初布萊德·確斯(Brad Cox)在其公司Stepstone發明Objective-C。他對軟體設計和編程里的真實可用度問題十分關心。
Objective-C最主要的描述是他1986年出版的Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.
2 語言分析
Objective-C是非常「實際」的語言。它使用一個用C寫成、很小的運行庫,只會令應用程序的大小增加很小,和大部分OO系統使用極大的VM執行時間會取代了整個系統的運作相反。ObjC寫成的程序通常不會比其原始碼大很多。而其函式庫(通常沒附在軟體發行本)亦和Smalltalk系統要使用極大的內存來開啟一個窗口的情況相反。
Objective-C的最初版本並不支持垃圾回收。在當時這是爭論的焦點之一,很多人考慮到Smalltalk回收時有漫長的「死亡時間」,令整個系統失去功用。Objective-C為避免此問題才不擁有這個功能。雖然某些第三方版本已加入這個功能(尤是GNUstep), Apple在其Mac OS X 10.3中仍未引入這個功能。
另一個問題是ObjC不包括命名空間機制(namespace mechanism)。取而代之的是程序設計師必須在其類別名稱加上前綴,時常引致沖突。在2004年,在Cocoa編程環境中,所有Mac OS X類別和函式均有「NS」作為前綴,例如NSObject或NSButton來清楚分辦它們屬於Mac OS X核心;使用「NS」是由於這些類別的名稱在NeXTSTEP開發時定下。
雖然Objective-C是C的母集,但它也不視C的基本型別為第一級的對象。
和C++不同,Objective-C不支援運運算元多載(它不支持ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許對象繼承一個類別(不設多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒有很多缺點,例如額外執行時間過重和二進制不兼容。
『拾』 objective-c語言屬於什麼語言
Objective-C是非常「實際」的語言。它使用一個用C寫成、很小的運行庫,只會令應用程序的大小增加很小,和大部分OO系統使用極大的VM執行時間會取代了整個系統的運作相反。ObjC寫成的程序通常不會比其原始碼大很多。而其函式庫(通常沒附在軟體發行本)亦和Smalltalk系統要使用極大的內存來開啟一個窗口的情況相反。 Objective-C的最初版本並不支持垃圾回收。在當時這是爭論的焦點之一,很多人考慮到Smalltalk回收時有漫長的「死亡時間」,令整個系統失去功用。Objective-C為避免此問題才不擁有這個功能。雖然某些第三方版本已加入這個功能(尤是GNUstep), Apple在其Mac OS X 10.3中仍未引入這個功能。
另一個問題是ObjC不包括命名空間機制(namespace mechanism)。取而代之的是程序設計師必須在其類別名稱加上前綴,時常引致沖突。在2004年,在Cocoa編程環境中,所有Mac OS X類別和函式均有「NS」作為前綴,例如NSObject或NSButton來清楚分別它們屬於Mac OS X核心;使用「NS」是由於這些類別的名稱在NeXTSTEP開發時定下。
雖然Objective-C是C的母集,但它也不視C的基本型別為第一級的對象。 和C++不同,Objective-C不支援運運算元多載(它不支持ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許對象繼承一個類別(不設多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒有很多缺點,例如額外執行時間過重和二進制不兼容。