//////////////////////////////////////////////////
所有指令
1.@property
@property 与@synthesize配对使用。xcode4.5以及以后的版本,@synthesize可以省略
@property int count;
(2)避免莫名其妙的Bug
在这里简单说一下_object和object的区别。_object是MyClass类的成员变量,object是属性。property和synthesize定义了一对getter和setter方法,在这里的getter方法是object,setter方法是setObject,事实上getter和setter方法操作的是变量_object。
@end
注意:
@property 只是setter和getter,不同与成员变量。
比如Category只可以有方法,不可以有成员变量,但是他却可以有@property
@interface MyClass:NSObject{
MyObjecct *_object;
O-C中父类的init()/release()函数需要子类的手动调用。而且每次都必须调用。不同于C++的自动调用。
构造函数(- (id) init)调用形如:CSample* pSample=[CSample alloc] init];其中alloc(+ (id) alloc)是继承来的static函数,init是继承来的一般函数,如重写一般函数时,则相当于C++的覆盖(不带参数)或重载(带参数)。
可以为一个类创建多个category,若多个category文件中定义了同一个方法,Object-C无法确定具体会调用那个方法。
同时需要注意,为一个类添加category,受影响的不仅仅是该类,也包括该类的子类在内。
只能添加新的方法,不能添加新的数据成员
若需要追加成员变量,在定义category时不能填写名字,如:
O-C使用nil表示NULL
O-Ck只支持单继承。
O-C使用YES/NO表示TRUE/FALSE
O-C使用#import代替#include
O-C中用消息表示类的方法,并采用[aInstance method:argv]调用形式。
O-C支持反射机制
O-C支持Dynamic Typing, Dynamic Binding和Dynamic Loading。
{
int i; //成员变量
}
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg; //对象的方法
+(id)someMethod:(int)someArg; //类方法
-(id)init; //初始化方法
@property int num; //属性
asterisk //星号*
directive //指令
colon //冒号
curly brackets //大括号{}
dash //破折号
与C++的不同之处有:
O-C中所有的类都必须继承自NSObject。
O-C中所有对象都是指针的形式。
O-C用self代替this。
O-C使用id代替void*。
+ (BOOL) instancesRespondToSelector: selector
用于判断该类是否能响应某个消息。这是一个静态函数。
-(id) performSelector: selector :调用对象的selector方法。
conformsToProtocol 类似于respondsToSelector ,用于动态检查某个对象是否遵守某个协议。
用于判断该对象是否属于某个类(这里不包括子类)
- (BOOL) respondsToSelector: selector
用于判断该对象是否能响应某个消息。这里,我们可以将@selector后面带的参数理解为C++中的函数指针。
注意:1)不要忘了@ 2)@selector后面用的是(),而不是[]。3)要在消息名称后面跟:,无论这个消息是否带参数。如:[pSquare respondsToSelector:@selector(Set: andHeight:)]。
@private
int privateVar;
}
@end
方法的访问限制可通过Category实现
示例:
@interface MyClass
- (void) sayHello {
NSLog(@"Hello");
}
@end
@interface MyClass(Private)
析构函数(- (void) release)将引用计数减1,当=0时父类的release()会自动调用dealloc(- (void) dealloc);
当O-C没有数据成员时,可省略{},建议保留。
继承下来的方法,如:-(id) init可以头文件中省略,建议保留
0-C中只有数据成员的访问限制,没有方法的访问限制。
@implementation Fraction
@synthesize uniqueID;
-(void) doStuffWithUniqueID: (int) theID
{
...
}
@end
Protocol:相当于C++中的纯虚类
形如:@interface MyDate: NSObject <Printing> { } @end
使用:
MyDate * dat = [[MyDate alloc] init];
id<Printing> var = dat;
[var print]。
在Objective C 中,我们通过<>来表示遵守某个协议。
使用id<Printing> 作为类型,而不是象C++中的Printing* var。
return _object;
}
(1)32位系统和64位系统的差异
在32位系统中,如果类的@interface部分没有进行ivar(instance variable)声明,但有@property声明,在类的@implementation部分有响应的@synthesize,则会得到类似下面的编译错误:
所有的对象都可以接受NSObject的三个方法:
-(id)retain;
-(void)release;
-(unsigned)retainCount;
Object C进行内存管理的3条规则是:
如果使用new、alloc或copy操作获得一个对象,则该对象的保留计数器值为1
如果通过任何其他方法获得一个对象,则假设该对象的保留计数器值为1,而且已经被设置为自动释放
@class someOtherObject //外部类型声明
@class是一个前向引用声明,类似于C++中的friend友元声明,其作用是告诉编译器其后面的字段代表一个类型名称,尽管不知道类型的具体实现,但是只需要将其作为一个类型名称处理即可。
@interfacesomeObject:NSObject //继承的类型
Object C 2.0增加了2个新的协议修饰符@optional和@required,可以规定协议中的方法是否为必须实现的方法。
@protocol someProtocol
-(void)someMethod;
@end
IBOutlet, IBAction: 这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder中能看到这个控件对象,那么在定义的时候前面加上IBOutlet,在IB里就能看到这个对象的outlet,如果你希望在Interface Builder里控制某个对象执行某些动作,就在方法前面加上(IBAction)。
@end
@implementationsomeObject
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg
{
//实现代码
}
@synthesize num=i; //将属性与变量进行对应,如果属性名也为i,则可以直接写为 @synthesize i
CG-:Core Graphics
UI-:User Interface
if (var) { delete var; }但是在objective c中,我们就可以直接写[var release];即使var == nil, 也不会有问题。
O-C中的构造/析构函数
O-C中的init()/release()对应于C++的构造/析构函数。alloc()/dealloc()也就对应于C++的new和delete,其中的dealloc()由于引用计数的自动调用而不用手动调用。
O-C中没有类的静态变量,只有全局变量
O-C中的数组NSArray可以保存不同类型的数据。
O-C也支持run-time时的类类型检查
- (BOOL) isKindOfClass: classObj
用于判断该对象是否属于某个类或者它的子类
- (BOOL) isMemberOfClass: classObj
等效于在头文件中声明2个方法: