如果我要在Objective-C中用 readonly属性替换所有访问者(类似get的const方法),是否有任何缺点?它们可以互换吗?
我更喜欢只读文件/可读性的属性。
来自C ++,我正在考虑用ObjC中的只读属性替换我所有的const方法(非可变方法)。
如果我遵守这个约定,那么我可以自动假设任何常规方法都将改变状态(C ++中的非const方法)。同样从功能编程的角度来看,知道readonly属性不会改变任何状态(没有副作用)是有用的。
答案 0 :(得分:3)
是的,当然 - 如果您愿意,可以通过这种方式实现。从上下文来看,这样做有很多好处。
要注意的缺点是生成的属性的成本 - 它们可能超过twenty times slower。如果(例如)您的财产不能重新分配,那么执行所有重新计算循环/自动释放活动将是一个巨大的浪费。
另一个(次要)缺点是您经常会发现自己正在实施或声明私人制定者。
答案 1 :(得分:2)
可以以相同的方式访问它们(点语法或方法语法)。做任何最好的事情。虽然我喜欢将方法作为方法,但是当他们做(某些)逻辑时。如果它只是一个访问者/获取者回馈一些数据,那么一个属性更适合。
答案 2 :(得分:1)
这与Key-Value Coding有关。请采取以下措施:
@interface Boat : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
和...
@interface Boat
@synthesize name;
@end
合成器的作用(在本例中)是创建两种方法:
-(NSString *)name;
-(void)setName;
它使用所谓的“驼峰盒”命名选择器,在将“set”添加到setter的前面之前将ivar的第一个字母更改为caps。吸气剂的名称只是ivar的名称。
如果你的ivar名称和现有方法都遵循这种模式,那么无论你使用点语法还是显式消息,用属性替换手写的访问器都会完美无缺:
boat.name = @"Pequod"
已汇编为[boat setName:@"Pequod"]
。 boat.name
已编译为[boat name]
。
如果您的访问者没有这样命名,那么您需要在代码中重新编写位置,以便与此模式匹配。根据这种模式编码是所有Objective-C / Cocoa编程的最佳方法。
答案 3 :(得分:1)
是的,它们是可以互换的。
@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;
。
答案 4 :(得分:1)
你仍然需要一些方法来设置它们,并且拥有一个合适的setter通常非常方便自动化内存管理。创建类扩展以实现此目的;公开读取,私下读写。
foo.h中:
@interface Foo : NSObject
@property(readonly, 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的codegen。