我更喜欢使用只读属性进行文档编写和可读性。
作为一名来自C ++的开发者,我正在考虑用只读属性替换掉所有的const方法(不可变方法)。
如果我坚持这个惯例,那么我可以自动假定任何常规方法都会改变状态(在C ++中是非const方法)。从函数式编程的角度来看,知道只读属性不会改变任何状态(没有副作用)是有用的。
它们可以以相同的方式访问(点语法或方法语法)。做任何感觉最好的事情。虽然我更喜欢将方法作为方法,当它们执行(一些)逻辑时。如果它只是一个访问器/获取器返回一些数据,那么属性更合适。
@interface Boat : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
而且...
@interface Boat
@synthesize name;
@end
在这种情况下,合成器所做的是创建两种方法:
-(NSString *)name;
-(void)setName;
它使用所谓的“驼峰命名法”来命名选择器,在将ivar的第一个字母改为大写后,在setter的前面添加“set”。getter的名称只是ivar的名称。
如果您的ivar名称和现有方法遵循此模式,则使用属性替换手写访问器将无缝工作,无论您使用点语法还是显式消息:
boat.name = @"Pequod"
编译为 [boat setName:@"Pequod"]
。而 boat.name
编译为 [boat name]
。
如果您的访问器没有这样命名,则需要重新设计代码中使用它们的地方以匹配此模式。根据此模式编码是所有Objective-C / Cocoa编程的最佳方法。
是的,它们是可互换的。
@interface MyClass : NSObject
@property (nonatomic, readonly) NSString *myStr;
@end
是相同的
@interface MyClass : NSObject
-(NSString *)myStr;
@end
@interface MyClass() { NSString *_myStr }
@end
@implementation MyClass
-(NSString *)myStr { return _myStr; }
@end
虽然在代码中看不到,但属性确实创建了一个可访问的myStr方法。在这两种情况下,您都可以使用self.myStr
或[self myStr]
来调用该方法。
顺便说一句:如果您正在使用iOS 6,则无需包含@synthesize语句。否则,您需要在实现文件中编写:@synthesize myStr = _myStr;
您仍然需要一些方法来设置它们,具有适当的setter通常非常方便,以实现自动内存管理目的。类扩展是为了实现这个目的而创建的;公开只读,私有可读写。
Foo.h:
@interface Foo : NSObject
@property(readonly, copy) NSString* bar;
@end
Foo.m: @interface Foo() @property(readwrite, copy) NSString* bar; @end
Foo.m: @interface Foo() @property(readwrite, copy) NSString* bar; @end@implementation Foo
... no need to @synthesize ...
- randomMethod
{ [self setBar: @"bas"]; ... self.bar; _bar = [NSString stringWithFormat: @"%@ %@", [self bar], self.bar]]; }
是的,您需要在@interface声明中使用copy
。即使在只读属性上,接口中的修饰符也可以修改getter和setter的代码生成。
您可能还会发现我的回答对这个问题相关。