【问题标题】:@synthesize syntax when overriding accessors覆盖访问器时的@synthesize 语法
【发布时间】:2011-07-31 14:43:17
【问题描述】:

我正在做一个值对象/实体,它为我的模型保存数据。 现在,我以 JSON 形式从 Web 服务获取数据,而不是将所有不同对象从解析的 JSON 移到我的实体上的不同属性中。即读出 @"name" 键的 NSString 并将其设置为 [Entity setName:[JSONDictionary objectForKey:@"name"] 等。我的实体有一个实际属性, NSDictionary *dataDictionary,这个属性保存了 JSON 字典,因为它离开了解析器。

现在,当我需要名称值时,我编写了一个如下所示的访问器:

- (NSString*) name {
    return [self.dataDictionary objectForKey:@"name"];
}

这很好,除非有对该特定属性的请求,否则我不需要做任何工作。

现在我的问题是如何最好地告诉编译器访问器存在,但不包含“真实”属性。 我的界面中有这个:

@property(nonatomic, retain) NSString *name;

还有我的实现中的@synthesize,但这似乎在我的逻辑中产生了开销。据我了解,Objective C 会在我执行@property(nonatomic, retain) 时为我在内存中腾出一个空间来存储 NSString 类型的对象,从技术上讲,我不需要这个,因为我已经将这个值存储在 @ 987654327@

如果我做到@dynamic 我想我还必须提供一个我永远不需要的setter。

那么,是否有一种语法可以让我给所有访问实体的对象创造一种错觉,即这些是“正常”属性,但在实体内部不会分配/存储不必要的对象或编写比需要更多的代码?

【问题讨论】:

    标签: objective-c accessor


    【解决方案1】:

    在您的界面中声明name 方法,而不是属性。

    - (void)name;
    

    【讨论】:

    • 是的,当然:),好多了。我把它复杂化了,然后我总是可以选择 - (void) setName:(NSString*) 如果我需要它。谢谢。
    • 不用担心@RickiG。这实际上是合成属性为您所做的 - 根据您提供的一些可变参数创建 getter(和 setter)方法。
    • 是的,所以我首先要求编译器为我生成访问器,然后覆盖它们。浪费电子:) 我想没有额外的 [价值保留] 因为覆盖,但方法方法更容易阅读
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2013-07-21
    • 2021-07-16
    相关资源
    最近更新 更多