张生个人开发历程

ios学习第二天,类和属性

类方法 

定义:类方法是一组全局方法的组合,属于整个类,而不属于对象。

使用:类方法只能向类发送消息,不能向对象发送。如:

          [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访问。

转自:http://appleparty.diandian.com/post/2012-05-15/18043909

posted on 2012-12-11 11:29  张生  阅读(137)  评论(0编辑  收藏  举报

导航