gpt4 book ai didi

Objective-C 属性 - getter 行为

转载 作者:太空狗 更新时间:2023-10-30 03:50:08 26 4
gpt4 key购买 nike

以下技术上有什么问题:

@property(nonatomic, assign) NSUInteger timestamp;
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime;
@property(nonatomic, assign) NSUInteger endTime;

我确信我可以找到一种更好的方法来组织它,但这是我在项目中的某个时刻结束的,我注意到访问 startTime 属性总是返回 0,即使时间戳属性已设置为正确的时间戳

似乎已经将 startTime 的 getter 设置为现有属性(时间戳),但当我这样做时它没有转发时间戳的值:

event.startTime => 0
event.timestamp => 1340920893

顺便说一句,所有这些都是时间戳。

提醒一下,我知道上述情况应该发生在我的项目中,但我不明白为什么访问 startTime 不会转发到时间戳属性。

更新

在我的实现中,我综合了所有这些属性:

@synthesize timestamp, endTime, startTime;

请查看我在 GitHub 上的 gist 中演示这一点的示例对象:https://gist.github.com/3013951

最佳答案

在您的描述方法中,您没有使用属性,而是访问了 ivar。

-(NSString*) description
{
return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >",
timestamp,
startTime]; // <-- This is accessing the instance variable, not the property.
}

这对你有用:

-(NSString*) description
{
return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >",
timestamp,
self.startTime]; // <-- This is using the property accessor.
}

property-vs-ivar 的事情总是把人们搞得一团糟,所以请原谅我在这里闲聊一分钟。 :) 如果您已经了解所有这些,请跳过。

当您像上面那样创建和合成一个属性时,会发生两件事:

  1. 创建了一个正确类型的 ivar。
  2. 创建了一个 getter 函数,它返回那个 ivar。

关于第 2 点的重要部分是,默认情况下,ivar 和 getter 函数(因此,属性)具有相同的名称

所以这样:

@interface Event
@property(nonatomic, assign) NSUInteger timestamp;
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime;
@end

@implementation Event
@synthesize timestamp, startTime;
@end

...变成这样:

@interface Event {
NSUInteger timestamp;
NSUInteger startTime;
}
@end

@implementation Event
- (NSUInteger) timestamp {
return timestamp
}

- (void) setTimestamp:(NSUInteger) ts {
timestamp = ts;
}

- (NSUInteger) startTime {
return [self timestamp];
}
@end

点语法的工作原理是:

NSUInteger foo = myEvent.startTime;

确实如此

NSUInteger foo = [myEvent startTime];

综上所述,当您访问一个 ivar 时,您就是……好吧,访问一个 ivar。当您使用属性时,您正在调用一个返回值的函数。更重要的是,当你想做另一件事时,做一件事非常容易,因为语法非常相似。出于这个原因,许多人通常会用前导下划线合成他们的 ivar,这样就更难搞砸了。

@property(nonatomic, assign) NSUInteger timestamp;
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime;

@synthesize timestamp = _timestamp;
@synthesize startTime = _startTime;

NSLog( @"startTime = %d", _startTime ); // OK, accessing the ivar.
NSLog( @"startTime = %d", self.startTime ); // OK, using the property.
NSLog( @"startTime = %d", startTime ); // NO, that'll cause a compile error, and
// you'll say "whoops", and then change it
// to one of the above, thereby avoiding
// potentially hours of head-scratching. :)

关于Objective-C 属性 - getter 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11252433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com