原子性:
默认的是atomic, 意味着对该属性进行读写操作时会进行加锁, 确保在多线程环境下, 任何一个线程对该属性的读写操作都是”完整的”, 读写进行期间不会被其他线程干涉.
由于使用了锁机制, atomic会造成性能损耗, 降低读写效率. 另外需要强调的是, atomic并不等于线程安全. 例如, 有两个子线程A和B, A线程需要连续多次读取某个属性的值, 而同时B线程又在修改这个属性的值, 那么就不能保证A线程多次读取的属性值是相同的.
与atomic对应的是nonatomic, 虽然不保证属性读写操作的原子性, 但是提高了读写效率. 在实际开发中, 一般并不要求属性读写的原子性, 因为这并不能保证线程安全, 所以大多数情况下都用nonatomic.

内存管理:
在ARC环境下, 默认的是strong(修饰对象类型), 表示强引用; 对应的是weak, 表示弱引用, 一般用来修饰delegate对象, 避免强引用循环.
对于基本数据类型, 比如int, float, double, NSInteger, NSUInteger, CGFloat, BOOL等, 默认的是assign(可省略不写), 表示简单赋值.
另外, 对于NSString, NSArray, NSDictionary类型的属性, 经常会使用copy关键字来修饰, 这是因为它们有着对应的可变子类NSMutableString, NSMutableArray, NSMutableDictionary, 这些子类的对象也可以用来给属性赋值. 拿NSString来说, 传递给setter方法的新字符串有可能是一个NSMutableString类的实例, 它是内容可变的字符串, 如果不在setter方法中拷贝一个副本, 那么设置完属性后, 这个可变字符串就可能会在某个地方被无意间进行修改, 导致程序出错. 所以, 为了确保字符串的值不会无意间变动, 应该使用copy关键字, 让编译器在setter方法中拷贝一份不可变的副本.

读写权限:
默认的是readwrite, 表示该属性既有getter方法, 又有setter方法; 对应的是readonly, 表示只有getter方法, 这个比较简单, 就不多言了.

存取方法:
对于BOOL类型属性的getter, 我们可以对它进行重命名, 在属性名前加上”is”前缀, 比如:

@property (nonatomic, getter=isFinished) BOOL finished;

这样做可以提高代码的可读性, finished和isFinished相比, 后者能更容易地让人知道该属性是BOOL类型的.
至于给setter方法重命名的情况, 实际开发中几乎不会用到, 也不推荐, 在这里就不进行介绍了.