Objective-C:可以用readonly属性替换所有访问器吗?

时间:2012-10-25 14:54:38

标签: objective-c properties styles

如果我要在Objective-C中用 readonly属性替换所有访问者(类似get的const方法),是否有任何缺点?它们可以互换吗?

我更喜欢只读文件/可读性的属性。

来自C ++,我正在考虑用ObjC中的只读属性替换我所有的const方法(非可变方法)。

如果我遵守这个约定,那么我可以自动假设任何常规方法都将改变状态(C ++中的非const方法)。同样从功能编程的角度来看,知道readonly属性不会改变任何状态(没有副作用)是有用的。

5 个答案:

答案 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。

你也可能find my answer to this question相关。

相关问题