是否有任何缺点,如果我要用 reparonly properties 替换所有我的所有 conscentors (get like const方法)-C?它们可以互换吗?
我更喜欢文档/可读性的可读性属性。
来自C ,我正在考虑用OBJC中的所有const方法(不可用的方法)替换为 readOnly properties
如果我遵守此公约,那么我可以自动假设任何常规方法都会改变状态(C 中的非const方法)。同样从功能编程的角度来看,知道可读属性不会改变任何状态(没有副作用)很有用。
是的,当然 - 如果选择,以此方式接近实现是可以的。从上下文中,这样做可能有许多优势。
劣势要注意的是生成属性的成本 - 它们的成本可能会慢20倍以上。如果(例如)您的财产不可重复分配,那么执行所有裁判计数循环/自动发行活动的巨大浪费。
另一个(次要的)劣势是您经常发现自己正在实施或宣布私人设置。
可以以相同的方式访问它们(点语法或方法语法)。做任何感觉最好的事情。尽管我更喜欢将方法作为方法,但是当它们具有(某些)逻辑时。如果仅是一个访问者/getter回馈一些数据,那么属性比属性更适合。
是的,它们是可互换的。
@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;
。
这与键值编码有关。采取以下内容:
@interface Boat : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
和...
@interface Boat
@synthesize name;
@end
合成器的作用(在这种情况下)是创建两种方法:
-(NSString *)name;
-(void)setName;
它使用所谓的"骆驼盒"将选择器命名,然后将ivar的第一个字母更改为帽子,然后再将"设置"添加到设定器的正面。Getter的名称只是IVAR的名称。
如果您的IVAR名称和现有方法遵循此模式,那么无论您使用DOT语法还是明确的消息,用属性替换手写的访问者都可以完美地工作:
boat.name = @"Pequod"
被编译为[boat setName:@"Pequod"]
。和boat.name
编译为[boat name]
。
如果您的登录未命名为此类,则需要在代码中使用它们匹配此模式的代码中的位置。根据此模式编码是所有Objective-C/Cocoa编程的最佳方法。
您仍然需要某种方法来设置'em,并且拥有适当的设置器通常非常方便地自动化内存管理目的。创建了班级扩展以实现此目的;公开阅读,私人阅读。
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
。接口中的修饰符,即使在ReadOnly属性上,也可以修改Getter和setter的代码。
您也可能会发现我对这个问题的答案。