10

编译器似乎对以下两个声明没有问题:

NSObject * __weak weakThing;
__weak NSObject *anotherWeakThing;

两者有区别吗?行为类似于const 关键字吗?

我问是因为 Xcode 的警告通常建议...

SomeDataType * __weak / __strong

...当你搞砸了一些事情时。所以我试图遵循这种模式,但想知道是否有区别。

4

2 回答 2

14

不,没有区别。使用const关键字,它可以应用于声明中的多种事物;它可以应用于指针,也可以应用于被指向的值。

所有权限定符仅对指向对象的指针有意义。对象本身不能是“强”或“弱”;它是指向强或弱对象的指针。ARC 仅在直接应用于指向对象的类型时才有意义,并且会影响指针的生命周期将如何影响对象的生命周期。

鉴于所有权限定符可以应用于什么从来没有任何歧义,ARC 规范允许将所有权限定符放置在指向对象的定义中的任何位置。你的两个例子同样有效。同样,以下所有含义都相同:

NSError * __autoreleasing * someObject;
NSError __autoreleasing ** someObject;
__autoreleasing NSError ** someObject;

请注意,编译器会抱怨这一点,但是:

NSError ** __autoreleasing someObject;

这是因为您已经超出了指向对象的定义。您可以将其解析为(NSError *)* __autoreleasing someObject;. 当你到达 second*时,你已经定义了指针的类型,所以__autoreleasing没有任何意义。指针类型定义中的任何地方都可以,但是一旦您转到指针到指针类型,那么您指的是其他东西,它不再有意义。

于 2012-01-18T17:41:21.543 回答
6

如果你有,那就有区别

 __weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing;

因为 __weak 只会混淆地应用于第一个变量。(这是和菜鸟类似的错误

NSObject* one, two;

这当然也不会像“预期的”那样工作)。

于 2013-10-07T16:45:50.870 回答