Objective-C:可以用ReadOnly属性替换所有登录器



是否有任何缺点,如果我要用 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的代码。

您也可能会发现我对这个问题的答案。

相关内容

  • 没有找到相关文章

最新更新