@property和@synthesize的使用

@property的用法:

  • 后面跟的都是类实例变量,而不是方法。
  • 编译器在翻译这句话的时候,会自动展开property中说明的实例变量的setter方法和getter方法的声明,不用我们再写。
  • 如果我们在写这个类的时候没有在花括号里面声明这些实例变量,则编译器会自动产生这些实例变量,但产生的实例变量缺省为前面加下划线的。

为什么会自动加上下划线呢?这是因为加上之后可以避免一些冲突。
如:NSString * _name; 如果实现中有一个方法给它赋值,那我可以写成,-(void)setName:name;其中name是我传过来的形参,可阅读性很强。
但如果实例变量中不加下划线,在实现方法中就没法写了, name = name;这句话就没有意义。
但如果加了下划线,则实现方法中是:_name = name;其中_name是实例变量,name是形参。不会造成冲突, 苹果公司也是这么考虑的吧。

@synthesize的用法:

  • synthesize后面跟的是property后面声明的实例变量

  • 因为property自动产生的实例变量是带下划线的,synthesize 后面一般会这么写 name = _name;就是告诉编译器,同意编译器前面对于property的实例变量带下划线的处理;也就是认可了property中的变量=大括号中的带下划线的变量,等价。
    但如果不写name = _name这种形式,仅写了,@synthesize name;这种,则是告诉编译器,不能把property中的变量name,在大括号中添加下划线,而是要使用不加下划线的,如name。如果程序员在大括号中自己写了_name,propterty中也写了name,只要写成synthesize name;则编译器认为程序员自己写的_name和property中的name是两个不同的实例变量,因为编译器自己翻译产生的大括号中的实例变量将是不带下划线的name;

  • synthesize会自动产生property声明变量的setter和getter方法在.m文件中的实现。

注意:

1、还需要说明的是,点语法不是property和synthesize产生的,而是标准setter和getter方法产生的,因为property和synthesize正好产生了系统标准写法的setter和getter方法,所以就可以用点语法。如果程序员不用property和synthesize,自己实现那个标准写法的setter和getter方法,系统一样认可,也可以使用点语法。

2、synthesize可以省略不写,不写的话,默认产生带下划线的实例变量和实现方法。如果程序员自己大括号中声明了实例变量,property也声明了同样的实例变量,则最好写上synthesize。

你可能感兴趣的:(@property和@synthesize的使用)