类方法
定义:类方法是一组全局方法的组合,属于整个类,而不属于对象。
使用:类方法只能向类发送消息,不能向对象发送。如:
[myClass classMethod];
类方法还可以将消息发送给类的子类。如
NSArray有一个类方法array,那么它的子类NSMutableArray也能接受array。
注意: 1. 在类方法中不能使用实例变量。
为什么要使用类方法?
答: 1. 为对象分配内存。 alloc
2. 在不希望每次都实现实例,可以利用类方法创建一个全局对象。
3. 可以创建一些"工具方法"。
(第2条和第3条我是完全没弄懂,老头子只是代过。。等弄懂了再写例子上来)
属性
定义:在定义一个实例变量之后,有两个基本的操作,setter and getter。前者是为变量设置 值,后者则是得到变量的值。如:有一个实例变量 int eye,
-(void)setEye : anEye
{
eye = anEye ;
}
-(int)eye
{
return eye;
}
这两个方法有特定的命名规则:setter往往在实例变量名前加set,getter则直接使用变量名。
也就是说,在你定义了一个实例变量之后,往往需要实现setter,getter。有没有更简单的方法来设置呢?答案是有的,object-c中增加了两个关键字:
@property : 等效于在声明中声明 setter,getter。
@synthesize : 等效于在实现中实现setter,getter。
如:
在.h文件中
int eye;
@property int eye;
在 .m 文件中
@synthesize eye ;
这样你就可以用 点 “.“去操作eye的存储与读取。
self. 的实质是调用setter , getter方法。如果需要多次用到self.eye,而值又不会改变,则可以先声明一个局部变量 int eye = self.eye ;减少调用次数。
你还可以给变量增加一些限制,如
@property (参数1 , 参数2) int eye ;
这里的参数主要分为三类:
1. 读写属性 (readwrite/readonly)
2.setter语意 (assign/retain/copy)
1)assign : 默认类型,setter方法直接赋值,而不进行retain操作
2)retain : setter方法对参数进行release旧值,再retain新值。
3)copy : setter方法进行Copy操作,与retain一样,对参数进行release旧值,再retain新值。
3.原子性 (atomicity/nonatomic)
nonatomic : 禁止多线程,变量保护,提高性能
这些参数的实质,就是改变了变量的setter和getter方法。
注意:
1。你所声明的变量,int eye; 与你所想设置属性的变量名不必一致,
@property int P_eye ;
你只需要@synthesize eye = P_eye ;就可以了
2。当你在.m 中又使用了synthesize ,又写了setter,getter, 那么@synthesize将被忽略。
3。如果你没有任何的实例变量,只有属性,那么你就必须自己在.m 中去实现setter,getter,而不能用@synthesize 。(这个是老头子说的,没怎么懂)
为什么要使用@property ?
答:主要是为了实例变量的安全(检查),和可继承性的考虑。
所有的@property都要设置成public 并且在头文件中定义吗?
答:NO!在 .m 文件中,放一个 @interface (这个是私有的) 可以实现私有化
@interface MyObject ()
@property int myEyesOnly ;
@end
这个interface只属于这个文件,他里面的所有东西都能被这个文件所访问了。需要注意的是,它里面不能放实例变量,只能放属性和方法。
然后在implemetation 中实现。
这里的myEyesOnly只能通过self.myEyesOnly访问。