美文网首页
OC的@interface @property @synthes

OC的@interface @property @synthes

作者: 我是谁重要吗 | 来源:发表于2018-03-28 21:18 被阅读44次

    为什么.h文件和.m文件里各有1个@interface?它们分别有什么用?

    .h里面的@interface,不消说,是典型的头文件,它是供其它Class调用的。它的@property和functions,都能够被其它Class“看到”。

    详见 类别 :

    而.m里面的@interface,在OC里叫作Class Extension,是.h文件中@interface的补充。但是.m文件里的@interface,对外是不开放的,只在.m文件里可见。

    因此,我们将对外开放的方法、变量放到.h文件中,而将不想要对外开放的变量放到.m文件中(.m文件的方法可以不声明,直接用)。

    有的同学看到Class Extension,可能会想到OC里的@protocol。是的,它们都是对一个Class的扩展。不过它们的区别也很明显:

    Class Extension只能用在能得到源代码的情况下,而@protocol在得不到源码的时候也可以使用。

    因此@protocol一般用作对一些系统Class的扩展,常见的比如对NSString、UIView等。

    .h中,value1为什么要定义2遍?

    当然,现在@interface{}里的定义也可以省略掉了,不过原理还是要搞清楚。

    严格来说@interface{}里定义的变量,叫作instance variable,它是这个Class内部真正的全局变量。然而这个instance variable是不对外公开的,因此我们还需要一个对外公开的东西来调用,就是@property
    @property是对外的,它其实是告诉大家,我这个Class里,有一个变量的set/get方法。比如,@property NSString* string; 就是说,本Class里有一个getString/setString供你们调用。

    因此需要2次声明。当然现在lldb也升级了,只要你声明了@property,它就可以自动创建对应的全局变量。

    使用@property定义变量ivar无非三种情况
    1)没有合成@synthesized ,则系统会通过Autosynthesized合成一个_ivar
    2)如果使用@synthesized ivar;则声称的变量为ivar
    3)如果使用@synthesized ivar = _ivar;则声明的变量为_ivar。

    注意这里的self.myString其实是调用的myString属性的setter/getter方法。
    如果使用self.ivar则三种定义方法都可以,因为self.ivar是调用的getter方法。
    最后,目前Apple推荐的定义方法是第3)种。而且无需在@interface里面再定义变量,如果需要定义私有变量的话,可以在.m中用@property定义。

    @property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法。
    那么在.m文件中可以直接的使用_myString实例变量,也可以通过属性self.myString.都是一样的。

    如果点表达式(self.myString)出现在等号 = 左边,调用该属性名称的setter方法。如果点表达式出现在=右边,调用该属性名称的getter方法。

    成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。
    除去基本数据类型int float ....等,其他类型的变量都叫做实例变量。

    @synthesize有什么用?

    @property 一个变量后,在@implementation里再@synthesize一下,相信是很多人的习惯。但是为什么要有这个@synthesize方法呢?

    @property是对外声明了Class的get/set方法,然后我们就需要在.m文件里手写get/set方法。这可就麻烦了,1个变量对应2个方法,假如一个Class里有10个变量,那岂不是要写20个方法?烦也烦死唠。

    @synthesize帮我们解决了这个问题。@synthesize在.m文件里自动生成了get/set方法。因此,我们只要在@implementation后面加上一行:@synthesize 就可以自动生成get/set方法了,省掉了很多麻烦。比如@synthesize value1 = _value1;的意思就是,将instance variable _value1用作getValue1和setValue1方法里。

    get/set方法有时候是比较复杂的,因为它和变量的属性相关,就是@property(nonatomic, assign/retain(strong/weak))这就和内存有关了。然而@synthesize为我们做了这些事情,就不要再为这些事情烦恼了!

    更方便的是,从Xcode4.4开始,编译器会自动为每一条@property都添加一条对应的@synthesize,因此以后我们只要写一个@property就可以了!

    相关文章

      网友评论

          本文标题:OC的@interface @property @synthes

          本文链接:https://www.haomeiwen.com/subject/iwaucftx.html