一 基本语法
1 头文件.h,实现文件.m
2 import 是引用
3 头文件中用
@interface开始一个类的定义,
@end
结束
.m文件中用
@implementation开始实现
@end
结束
4 函数写法
-(void)setNumerator: (int) n;
-(void)setNumerator: (int) n andDenominator: (int) d;
method:label1:label2:label3:,而呼叫的方法是 [obj method:param1 label1: param2 label2: param3 label3: param4]
这个是头文件中的申明,-就表示成员函数,如果是加号,那么就相当于static,
setNumerator是函数名称,void是返回,后面的(int) n,是参数,如果没有参数,那么就直接-(void) setNumerator;
5函数调用
在Objective-C 中呼叫 methods 的方法是[object method],就像 C++ 的object->method()。
Eg:
[fracsetNumerator: 1]; //frac是对象指针,1是参数
[frac2setNumerator: 1 andDenominator: 5];
Objective-C没有 value 型别。所以没有像 C++ 的 Fraction frac; frac.print(); 这类的东西。在 Objective-C 中完全使用指针来处理对象。
6 oc中用self 代贴this
self = [super init];
nil是 Objective-C 用来表达 C/C++ 中 NULL 的方式,
if(self != nil )
7 访问权限
预设的权限是 @protected
@interface Access: NSObject {
§ @public
§ int publicVar;
§ @private
§ int privateVar;
§ int privateVar2;
§ @protected
§ int protectedVar;
§ }
@end
如同你所看到的,就像 C++ 中 private: [list of vars] public: [listof vars] 的格式,它只是改成了@private, @protected, 等等。
8 异常情况(Exceptions)
注意:异常处理只有 Mac OS X 10.3 以上才支持。
#import<Foundation/NSException.h>
@try {
§ [cup fill];
§ } @catch (CupWarningException *e ) {
§ printf( "%s: ",[[e name] cString] );
§ } @catch (CupOverflowException *e ) {
§ printf( "%s: ",[[e name] cString] );
§ } @finally {
§ [cup print];
§ }
9 动态识别(Dynamic types)
-(BOOL) isKindOfClass: classObj | is object a descendent or member of classObj 此对象是否是 classObj 的子孙或一员 |
-(BOOL) isMemberOfClass: classObj | is object a member of classObj 此对象是否是 classObj 的一员 |
-(BOOL) respondsToSelector: selector | does the object have a method named specifiec by the selector |
此对象是否有叫做 selector 的 method | |
+(BOOL) instancesRespondToSelector: selector | does an object created by this class have the ability to respond to the specified selector 此对象是否是由有能力响应指定 selector 的对象所产生 |
-(id) performSelector: selector | invoke the specified selector on the object 唤起此对象的指定 selector |
10 Category 类目
Category提供一种为某个类添加方法而又不必编写子类的途径。
比如 有一个类MyClass,现在我又想再加个add方法在里面,
@interface MyClass(Math)
§ -(MyClass*) add: (MyClass*) f;
@end
就没有用继承了。
如果你新加的函数和类之前的函数同名,那么在[object method]的时候,优先调用类本身以前的方法
注:如果interface的方法,和
implementation的方法都在.m文件中 那么这个方法就相当于是private了,因为interface不在.h中,那么别的文件也就import不到了,就相当于是private了
11 Posing 扮演
Posing有点像 categories,但是不太一样。它允许你扩充一个 class,并且全面性地的扮演(pose)这个 super class。例如:你有一个扩充 NSArray 的 NSArrayChild 物件。如果你让 NSArrayChild 扮演 NSArray,则在你的程序代码中所有的 NSArray 都会自动被替代为 NSArrayChild。
12 Protocols 协议
Objective-C里的 Protocol 与 Java 的 interface 或是C++ 的 purely virtual class 相同。
@protocol Printing
§ -(void) print;
@end
@interface Fraction: NSObject <Printing, NSCopying> {
§ int numerator;
§ int denominator;
§ }
就像使用@selector来测试对象的继承关系,你可以使用 @protocol 来测试对象是否遵从接口。如果对象遵从这个接口,[object conformsToProtocol: @protocol( SomeProtocol )] 会回传一个 YES 型态的 BOOL 对象。同样地,对 class 而言也能如法炮制 [SomeClass conformsToProtocol:@protocol( SomeProtocol )]。
13 内存管理
Retain and Release
引用计数
[frac1 retainCount] 查看
[frac1 retainCount] 加1
[frac1 release]; 减1
当retainCount减到0时,就自动调用dealloc ,销毁自己
Autorelease Pool
千万记得,要有良好的内存管理,像 [NSStringstringWithString: @"String"] 这种 method 使用了 autorelease pool,而 alloc method 如 [[NSString alloc]initWithString: @"String"] 则没有使用 auto release pool。
Autorelease好处,就是调用一次,就可以不管它了(调用的时候,当然没有被release掉),知道最后[pool release],那个时候,就会把这些该release的release掉了
14 Foundation framework classes 框架(c++的模板)
Foundationframework 地位如同 C++ 的 Standard Template Library。不过 Objective-C 是真正的动态识别语言(dynamic types),所以不需要像 C++ 那样肥得可怕的样版(templates)。这个 framework 包含了对象组、网络、线程,还有更多好东西。
NSArray
NSArray跟 NSMutableArray,顾名思义,mutable(善变的)表示可以被改变,而 NSArray 则不行。这表示你可以制造一个 NSArray 但却不能改变它的长度。
NSArray *arr = [[NSArray alloc] initWithObjects:
§ @"Me",@"Myself", @"I", nil]; nil是结尾符号
[[objdescription] cString]
descriptionmethod。它就像 Java 的 toString,会回传对象的 NSString 表示法。
NSDictionary 有点像map
15 优点与缺点
优点
§ Cateogies
§ Posing
§ 动态识别
§ 指标计算
§ 弹性讯息传递
§ 不是一个过度复杂的 C 衍生语言
§ 可透过 Objective-C++ 与 C++ 结合
o 缺点
§ 不支持命名空间
§ 不支持运算符多载(虽然这常常被视为一个优点,不过正确地使用运算符多载可以降低程序代码复杂度)
§ 语言里仍然有些讨厌的东西,不过不比 C++ 多