现在的位置: 首页 > 综合 > 正文

object-c小结

2019年08月14日 ⁄ 综合 ⁄ 共 4088字 ⁄ 字号 评论关闭

XCode:可以把它看成是一个开发环境,就好像Visual Studio或者Netbeans或者SharpDevelop一样的玩意。可以将Interface
Builder
认为是Visual Studio中用来画界面的那部分功能单独提出来的程序。

Objective-C:这是一种语言,就好像c++是一种语言,Java是一种语言,c#是一种语言,莺歌历史也是一种语言一样。

Cocoa:是一大堆函数库,就好像MFC.NETSwing这类玩意,人家已经写好了一堆现成的东西,你只要知道怎么用就可以了。

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

CNULL,OCnil

Objective-C 有种叫做 id
的型别,它的运作有时候像是 void*,不过它却严格规定只能用在对象。

基本类别库 import NSObject.hBOOL型为YES or NO

#import vs #include#import#import
gcc
编译器支持。我并不建议使用 #include#import

本上跟 .h 档头尾的 #ifndef #define #endif
相同。


Objective-C
的预设扩展名是 .m

 

@interface... @end


Implementation
@implementationClassName
开始,以 @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;
这是 classvariable
宣告的方式。+(int) initCount;
这是回传 count
值的实际 method+(void) initialize method is
Objective-C
开始执行你的程序时被呼叫,而且它也被每个 class
呼叫。

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

@catch ( id e ) { ... }

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

Objective-C C#
C++
不一样,你在呼叫一个对象的 method
时,并不需要知道这个对象的型别。当然这个 method
一定要存在,这称为 Objective-C
的讯息传递。你不需要知道你呼叫 method
的那个东西是什么型别,如果这个对象对这个讯息有反应,那就会唤起这个 method

继承(Inheritance
当你扩充你的 super class(所以只能有一个 parent),你想自订这个 super
class
method,只要简单的在你的 child classimplementation
里放上新的实作内容即可。

动态识别(Dynamic types
-(BOOL) isKindOfClass:classObj,即is object a descendentor 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
的宣告十分简单,基本上就是 @protocolProtocolName (methods you must implement) @end  要遵从(conform)某个
protocol
,将要遵从的 protocols
放在 <>
里面,并以逗点分隔。如:@interface SomeClass <Protocol1,Protocol2, Protocol3>

protocol 要求实作的 methods
不需要放在 header
档里面的 methods
列表中。
可以使用 @protocol
来测试对象是否遵从接口。如果对象遵从这个接口,[objectconformsToProtocol:
@protocol( SomeProtocol )]
会回传一个 YES
型态的 BOOL
对象。


内存管理

Retain and Release(保留与释放)
Retain
以及 release
是两个继承自 NSObject
的对象都会有的 methods。每个对象都有一个内部计数器,可以用来追踪对象的 reference
个数。如果对象有 3
reference
时,不需要 dealloc
自己。但是如果计数器值到达 0
时,对象就得 dealloc
自己。[objectretain]
会将计数器值加 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
来做更多程序设计工作时,你需要一个更有弹性的系统,也就是使用 Autoreleasepools。当开发 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
很像 C#
的列举系统

NSDictionary
#import <Foundation/NSDictionary.h>
(不是很明白包含哪些东东)

【上篇】
【下篇】

抱歉!评论已关闭.