最新消息:网站改版咯

Objective-C

C语言 Yovae 1574浏览

1.Objective-C是什么?

Object-C是由   Brad   Cox在80年代初在第一个纯面向对象语言Smalltalk基础上写成。后来他创立了StepStone公司从事Objective-C的推广。1988年,Steve   Jobs的NextStep采用Objective-C作为开发语言,1992年GNU   gcc编译器中包含了对Objective-C的支持(gnu-objc   runtime),   Dennis   Glating   写了第一个run-time。Richard   Stallman   第二个,最近的是Kresten   Krab   Thorup在丹麦读大学时写的,   他后来到NextStep工作。

目前,   Objective-C   是Mac   OS   X的首要开发语言,也是GNUstep   在Linux   和其它平台上的开发语言。
Objective-C   是ANSI   C的超集,扩展了C   语言使它具备面向对象设计的能力,如类,消息和继承。Objective-C   程序中可以利用现有的C语言代码,使其利用现有的软件架构。这也是为甚莫Objective-C   过去多年间能够成为一种流行的用户界面开发语言而且至今没有消亡,因为一方面用它可以实现底层系统编程,另一方面可以支持利用动态架构进行开发。

2.Objective-C 和C++的比较

单一继承: Objective-C不支持多重继承,(同Java和Smalltalk),而C++语言支持多重继承。
动态:
Objective-C是动态定型(dynamicaly typed)所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。
C++ 跟从面向对象编程里的Simula 67(一种早期OO语言)学派,而Objecive-C属于Smalltalk学派。
在C++里,对象的静态类型决定你是否可以发送消息给它,而对Objecive-C来说,由动态类型来决定。Simula 67学派更安全,因为大部分错误可以在编译时查出。 而Smalltalk学派更灵活,比如一些Smalltalk 看来无误的程序拿到Simualr 67那里就无法通过。
从很多方面来看,C++和Objective-C的差别,与其说时技术上的, 不如说是思维方式上的。你是否想更安全而舍弃灵活性?Simular67学派的支持者声称既然程序设计出色何必再要灵活性(谎话!),而 Smalltalk学派则辩称为了灵活可以容忍运行时多出错。

3.学object c有什么用?

Mac OS X 上 Objective C 是基础的开发语言。使用object c可以方便地开发MAC OS上的应用程序 特别是Iphone平台上的应用程序。

当然这些都是最近流行的,一门语言的用途关键还是看使用者怎么用了。

4.如何学习Objective-C

1.请先把C语言基础学好;
2.看《Programming in Objective-C 2.0》,不要看《Objective-C 2.0程序设计》;
3.看《Cocoa Design Patterns》和《Cocoa Programming Developer’s Handbook》,不要因为他们很难而我们自己是初学者所以就不看;
4.是的,你需要一台Mac,如果你真的打算好好学Objective-C和Cocoa的话;
5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
6.会用Objective-C,并不说明你会Cocoa编程;
7.学语法并不难,Foundation,Appkit,UIKit,Core Data,Core Animation也不过如此——难的是长期坚持实践和不遗余力的查阅文档;
8.请时刻记住,要写出好的App,界面设计和程序功能同等重要——其实可以时刻记住:Mac/iOS用户界面规约也是必读的文档;
9.不看C语言的书,是学不好Objective-C语言的;
10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
16.Cocoa是Objective-C的框架,主要包括Foundation,Appkit和Core Data。Cocoa Touch是Cocoa的iOS版本,主要包括Foundation,UIKit和Core Data;
17.Objective-C不仅仅是为C加了个类——运行时环境同样至关重要;
18.学习编程最好的方法之一就是阅读文档和源代码,请善用Xcode文档里的程序实例源代码;
19.请记住,Objective-C是“动态”的语言;
20.请阅读《Objective-C 2.0 Programming Language》等文档——官方的文档总是最权威,最完整的参考书;
21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
23.请记住,iOS和Mac开发本质上是相同的,不过区别也同样要被重视;
24.不要停留在Xcode的层面上。掌握通过命令行使用gcc和gdb,以及git等工具,将使你效率倍增;
25.和别人一起讨论有意义的Objective-C和Cocoa知识点,而不是争吵Cocoa行不行或者Objective-C与C++哪个好;
26.不要被各种Core XXX等“技术”名词所迷惑,它们只不过是C和Objective-C的框架(库)而已;
27.如果你学过C++,请暂时忘记使用.(点)调用方法,Objective-C是用方括号的,并且更准确的名字叫做“消息传递”;
28.Objective-C是C语言的严格超集,和C语言联系紧密,C语言是Objective-C的一部分;
29.请不要认为学过C++语言再改学Objective-C就没有什么问题——你只不过又在学一门全新的语言而已;
30.读完了《Cocoa Programming Developer’s Handbook》以后再来认定自己是不是已经学会了Objective-C;
31.学习编程的秘诀是:编程,编程,再编程;
32.请留意下列书籍:《Cocoa Programming Developer’s Handbook》《Cocoa Design Pattern》《iOS 4 Advaced Programming》《Cocoa Programming A Quick-Start Guide for Developers》;
33.不要因为苹果是个商业公司,你就可以忘记开源。于个人来说,开源是给予,但你却获得了更多。别忘了,苹果自己也使用了大量开源技术;
34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
35.空闲的时候可以把自己的想法变成代码,并放到github上去,或把它变成App Store里的一个软件;
36.请重视Objective-C的运行时环境编程,并将其切实的运用到自己的程序中;
37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
39.Objective-C,Cocoa和Xcode集成开发环境要同时学习和掌握;
40.既然决定了学Objective-C,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
41.工欲善其事,必先利其器,要做好Objective-C和Cocoa开发,请用好Xcode;
42.当你写Cocoa程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的 错误并重新设计和编写(参见43);
43.别心急,设计Objective-C的类确实不容易;自己程序中的类和自己的类设计水平是在不断的编程实践中完善和发展的;
44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
45.每学到一个Objective-C的难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
47.请不断地对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
48.保存好你写过的所有的程序——github是你最佳的代码托管工具;
49.请不要做浮躁的人;
50.请热爱Objective-C!

5.object c语法

 

XCode:你可以把它看成是一个开发环境,就好像Visual Studio或者Netbeans或者SharpDevelop一样的玩

意。你可以将Interface Builder认为是Visual Studio中用来画界面的那部分功能单独提出来的程序。
Objective-C:这是一种语言,就好像c++是一种语言,Java是一种语言,c#是一种语言,莺歌历史也是一

种语言一样。
Cocoa:是一大堆函数库,就好像MFC、.NET、Swing这类玩意,人家已经写好了一堆现成的东西,你只要

知道怎么用就可以了。

减号表示一个函数、或者方法、或者消息的开始
括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。
同一个数组可以保存不同的对象

C用NULL,OC用nil
Objective-C 有种叫做 id 的型别,它的运作有时候像是 void*,不过它却严格规定只能用在对象。
基本类别库 import NSObject.h;BOOL型为YES or NO
#import vs #include:#import。#import 由 gcc 编译器支持。我并不建议使用 #include,#import 基

本上跟 .h 档头尾的 #ifndef #define #endif 相同。
Objective-C 的预设扩展名是 .m

类:@interface… @end
Implementation 以 @implementation ClassName 开始,以 @end 结束,用来定义类里的函数
继承(inheritance)以 Class: Parent 表示,就像上面的 Fraction: NSObject
在 Objective-C 中呼叫 methods 的方法是 [object method],就像 C++ 的 object->method()
[object init] 是一个建构子(constructor)呼叫,负责初始化对象中的所有变量。
[frac setNumerator: 1] 非常简单。它呼叫了 frac 上的 setNumerator method 并传入 1 为参数
Objective-C 也有一个用以释放内存的方式: release
传递多重参数用set..and:[frac2 setNumerator: 1 andDenominator: 5];单重时只用set
加入其它参数的方法就跟加入第二个时一样,即 method:label1:label2:label3: ,而呼叫的方法是 obj

method: param1 label1: param2 label2: param3 label3: param4]

建构子(Constructors)
@interface 里的宣告就如同正常的函式
@implementation 使用了一个新的关键词:super
使用 [super init] 来存取 Super constructor,这个动作需要适当的继承设计

存取权限
预设的权限是 @protected
就像 C++ 中 private: [list of vars] public: [list of vars] 的格式,它只是改成了@private,

@protected, 等等

Class level access
static int count = 0; 这是 class variable 宣告的方式。+(int) initCount; 这是回传 count 值的

实际 method。+(void) initialize method is 在 Objective-C 开始执行你的程序时被呼叫,而且它也

被每个 class 呼叫。

异常情况(Exceptions)
注意:异常处理只有 Mac OS X 10.3 以上才支持
Exceptions(异常情况)的丢出不需要扩充(extend)NSException 对象,你可简单的用 id 来代表它:

@catch ( id e ) { … }

继承、多型(Inheritance, Polymorphism)以及其它对象导向功能

Objective-C 与 Java 跟 C++ 不一样,你在呼叫一个对象的 method 时,并不需要知道这个对象的型别

。当然这个 method 一定要存在,这称为 Objective-C 的讯息传递。你不需要知道你呼叫 method 的那

个东西是什么型别,如果这个对象对这个讯息有反应,那就会唤起这个 method。

继承(Inheritance)
当你扩充你的 super class(所以只能有一个 parent),你想自订这个 super class 的 method,只要

简单的在你的 child class implementation 里放上新的实作内容即可。

动态识别(Dynamic types)
如-(BOOL) isKindOfClass: classObj,即is object a descendent or member of classObj

Categories
当你想要为某个 class 新增 methods,你通常会扩充(extend,即继承)它。然而这不一定是个完美解

法,特别是你想要重写一个 class 的某个功能,但你却没有原始码时。Categories 允许你在现有的

class 加入新功能,但不需要扩充它。Ruby 语言也有类似的功能。包括-(Fraction*) add: (Fraction*)

f; -(Fraction*) mul: (Fraction*) f; -(Fraction*) div: (Fraction*) f; -(Fraction*) sub:

(Fraction*) f;等

Posing
Posing 有点像 categories,但是不太一样。它允许你扩充一个 class,并且全面性地的扮演(pose)这

个 super class。如果你让 NSArrayChild 扮演 NSArray,则在你的程序代码中所有的 NSArray 都会自

动被替代为 NSArrayChild。[FractionB poseAsClass: [Fraction class]];

Protocols
Objective-C 里的 Protocol 与 Java 的 interface 或是 C++ 的 purely virtual class 相同。
protocol 的宣告十分简单,基本上就是 @protocol ProtocolName (methods you must implement) @end
要遵从(conform)某个 protocol,将要遵从的 protocols 放在 <> 里面,并以逗点分隔。如:

@interface SomeClass <Protocol1, Protocol2, Protocol3> 。
protocol 要求实作的 methods 不需要放在 header 档里面的 methods 列表中。
可以使用 @protocol 来测试对象是否遵从接口。如果对象遵从这个接口,[object conformsToProtocol:
@protocol( SomeProtocol )] 会回传一个 YES 型态的 BOOL 对象。
内存管理

Retain and Release(保留与释放)
Retain 以及 release 是两个继承自 NSObject 的对象都会有的 methods。每个对象都有一个内部计数器

,可以用来追踪对象的 reference 个数。如果对象有 3 个 reference 时,不需要 dealloc 自己。但是

如果计数器值到达 0 时,对象就得 dealloc 自己。[object retain] 会将计数器值加 1(值从 1 开始

),[object release] 则将计数器值减 1。如果呼叫 [object release] 导致计数器到达 0,就会自动

dealloc。
你可以呼叫 [obj retainCount] 来取得计数器的 int 值。

Dealloc
当你的对象包含其它对象时,就得在 dealloc 自己时释放它们。Objective-C 的一个优点是你可以传递

讯息给 nil,所以不需要经过一堆防错测试来释放一个对象。
每个 set method 里的三个动作的顺序非常重要。假设你把自己当参数传给一个自己的 method(有点怪

,不过确实可能发生)。若你先 release,「然后」才 retain,你会把自己给解构(destruct,相对于

建构)!这就是为什么应该要 1) retain 2) release 3) 设值 的原因

Autorelease Pool
当你想用 NSString 或其它 Foundation framework classes 来做更多程序设计工作时,你需要一个更有

弹性的系统,也就是使用 Autorelease pools。当开发 Mac Cocoa 应用程序时,autorelease pool 会自

动地帮你设定好。
#import <Foundation/NSAutoreleasePool.h>
在 Objective-C 有两种管理内存的方法, 1) retain and release or 2) retain and

release/autorelease。对于每个 retain,一定要对应一个 release 「或」一个 autorelease。

Foundation framework classes

Foundation framework 地位如同 C++ 的 Standard Template Library。不过 Objective-C 是真正的动

态识别语言(dynamic types),所以不需要像 C++ 那样肥得可怕的样版(templates)。这个 ramework

包含了对象组、网络、执行绪,还有更多好东西。

NSArray
数组有两种(通常是 Foundation classes 中最数据导向的部分),NSArray 跟 NSMutableArray,顾名

思义,mutable(善变的)表示可以被改变,而 NSArray 则不行。这表示你可以制造一个 NSArray 但却

不能改变它的长度。
NSArray *arr = [[NSArray alloc] initWithObjects: @”Me”, @”Myself”, @”I”, nil];
排序(sorting)展示如何用 selector 来排序一个对象
NSEnumerator 很像 Java 的列举系统

 

 

转载请注明:Yovae Studio » Objective-C