【问题标题】:what does "property with 'weak' attribute must be of object type" really mean?“具有'弱'属性的属性必须是对象类型”的真正含义是什么?
【发布时间】:2021-07-14 21:34:58
【问题描述】:

我的界面中有这个:

@property (nonatomic, weak) NSTimeInterval *timeStamp;

我的逻辑告诉我,我需要一个时间戳对象,它只会被此类在其实例化的上下文中使用,所以“弱”对我来说似乎是合乎逻辑的——但 XCode 告诉我“具有“弱”属性的属性必须是对象类型”...如果我这样做:

@property (nonatomic) NSTimeInterval *timeStamp;

然后错误消失了,但我不确定我明白为什么......

【问题讨论】:

  • 对于那些在这里的人,因为他们收到此消息时认为实际上是对象类型,而不是值类型:您记得#import 该类型的标头吗?我刚刚收到此错误,因为我在 Xcode 中为 ADBannerView 连接了一个 IBOutlet 并且愚蠢地忘记了 #import <iAd/iAd.h> 以便代码知道 ADBannerView 实际上是什么......

标签: objective-c ios


【解决方案1】:

问题在于NSTimeInterval 是一个值类型——它本质上是double 的别名(检查NSDate.h 中的typedef)。 weak 属性仅适用于具有保留计数的对象(即从 NSObjectNSProxy 下降的任何对象)。

因此,存储指向NSTimeInterval 的指针可能是您的错误。您很可能永远不会收到指向 NSTimeInterval 的指针,除非您希望写入给定地址作为函数的输出(在这种情况下可能是回调)。也就是说,我不知道有任何以NSTimeInterval * 作为返回类型的函数,也不知道有任何将其传递给回调的函数。

【讨论】:

  • 所以正确的做法就是@property (nonatomic) NSTimeInterval *timeStamp; ?
  • @patrick:@property (nonatomic) NSTimeInterval timeStamp;* 使它成为一个指针,你几乎肯定不想要它。
  • 任何有效的CFTypeRef 也可以与weakstrongretaincopy 关键字一起使用。
  • 这适用于所有核心基础类型还是仅适用于桥接类型?我不确定,因为这不是我研究过的东西,但绝对值得了解。
  • 桥接只起作用,因为 NS 类型是 CF 类型对象的 ObjC 包装器,所以在大多数情况下,是的。但老实说,你为什么要一个指向你不需要存储地址的值的指针(并且在你不需要的时候处理 malloc 和 free 是很痛苦的)。
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多