09-property

property


@property基本使用


  • 背景: @porperty是一个编译器指令, 在Xocde4.4之前, 可以使用@porperty来代替getter/setter方法的声明, 也就是说我们只需要写上@porperty就不用写getter/setter方法的声明, 由编译器生成某一个属性的getter/setter方法的声明

Person.h中代码示例

#import 
@interface Person : NSObject
{
    int _age;
}
//- (void)setAge:(int)age;
//- (int)age;
@property int age;//Xocde4.4之前, 相当于上面两句
@end

@synthesize基本使用


  • 背景: @synthesize是一个编译器指令, 它可以简化getter/setter方法的实现

  • 什么是实现: 在声明后面写上大括号就代表着实现

  • 作用: 1.在@synthesize后面告诉编译器, 需要实现哪个@property生成的声明; 2. 告诉@synthesize, 需要将传入的值赋值给谁和返回谁的值给调用者

Person.m中代码示例

#import "Person.h"
@implementation Person
/*
    - (void)setAge:(int)age
    {
        _age = age;
    }
    - (int)age
    {
        return _age;
    }
*/
@synthesize age = _age;//等价于上面的两个方法
//注意:如果在@synthesize后面没有告诉系统将传入的值赋值给谁, 系统默认会赋值给和@synthesize后面写得名称相同的成员变量
@end

@property增强


  • 背景: Xcode4.4以后apple对@property进行了一个增强, 以后只要利用一个@property就可以同时生成setter/getter方法的声明和实现

  • @property有一个弊端: 它只会生成最简单的getter/setter方法的声明和实现, 并不会对传入的数据进行过滤

    • 如果想对传入的数据进行过滤, 那么我们就必须重写getter/setter方法
    • 如果不想对传入的数据进行过滤, 仅仅是提供一个方法给外界操作成员变量, 那么就可以使用@property
  • @property自动生成一个_开头的成员变量:

    • 如果利用@property来生成getter/setter方法, 那么我们可以不写成员变量, 系统会自动给我们生成一个_开头的成员变量
  • 注意:

    • @property自动帮我们生成的成员变量是一个私有的成员变量, 也就是说是在.m文件中生成的, 而不是在.h文件中生成的
    • 如果同时重写了getter/setter方法, 那么property就不会自动帮我们生成私有的成员变量

@property修饰符


  • 读写权限:

    • readonly: 只会生成getter方法
    • readwrite: 既会生成getter也会生成setter, 默认什么都不写就是readwrite
  • getter、setter:

    • getter: 可以给生成的getter方法起一个名称
    • setter: 可以给生成的setter方法起一个名称
  • 多线程相关:

    • atomic :性能低(默认)
    • nonatomic :性能高(开发中使用nonatomic)
  • 内存管理相关:

    • retain: 就会自动帮我们生成getter/setter方法内存管理的代码, 用于MRC

    • assign: 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的getter/setter方法,用于基本数据类型, 默认什么都不写就是assign

    • strong: ARC中保存一个对象用strong, 相当于MRC中的retain, 用于ARC

    • weak: 在ARC中如果 弱引用对象不要用assign, 用weak, assign是专门用于保存基本数据类型的, 如果保存对象用weak

    • 关于内存管理的修饰符,详见: property 关键字的区别详解:assign 与weak、 __block 与 __weak、strong 与copy的区别

你可能感兴趣的:(09-property)