如果想要一个公开的getter和私有的setter,你应该声明公开的属性为 readonly 并且在类扩展总重新定义通用的属性为 readwrite 的。
复制代码//.h文件中
@interface MyClass : NSObject
@property (nonatomic, readonly, strong) NSObject *object;
@end
复制代码
//.m文件中
@interface MyClass ()
@property (nonatomic, readwrite, strong) NSObject *object;
@end
复制代码
@implementation MyClass
//Do Something cool
@end
描述BOOL属性的词如果是形容词,那么setter不应该带is前缀,但它对应的 getter 访问器应该带上这个前缀。
@property (assign, getter=isEditable) BOOL editable;
任何可以用来用一个可变的对象设置的((比如 NSString,NSArray,NSURLRequest))属性的的内存管理类型必须是 copy 的。(原文中是这样说的,但是我理解的话并不是绝对的。如果不想让原来的可变对象影响到类的这个相应属性,那么就需要用copy,这样在赋值的时候可变对象会首先进行copy完成深拷贝,再把拷贝出的值赋给类的属性,这样就能保证类属性和原来的可变对象影响并不影响。但是如果想让类属性对原来的可变对象是一个强引用,指向这个可变对象,那么会用strong。)
你应该同时避免暴露在公开的接口中可变的对象,因为这允许你的类的使用者改变类自己的内部表示并且破坏类的封装。你可以提供可以只读的属性来返回你对象的不可变的副本。
复制代码/* .h */
@property (nonatomic, readonly) NSArray *elements
/* .m */
- (NSArray *)elements {
return [self.mutableElements copy];
}
虽然使用懒加载在某些情况下很不错,但是使用前应当深思熟虑,因为懒加载通常会产生一些副作用。(但是懒加载还是比较常用的,比如下面的例子)










