编译器似乎对以下两个声明没有问题:
NSObject * __weak weakThing;
__weak NSObject *anotherWeakThing;
两者有区别吗?行为类似于const 关键字吗?
我问是因为 Xcode 的警告通常建议...
SomeDataType * __weak / __strong
...当你搞砸了一些事情时。所以我试图遵循这种模式,但想知道是否有区别。
编译器似乎对以下两个声明没有问题:
NSObject * __weak weakThing;
__weak NSObject *anotherWeakThing;
两者有区别吗?行为类似于const 关键字吗?
我问是因为 Xcode 的警告通常建议...
SomeDataType * __weak / __strong
...当你搞砸了一些事情时。所以我试图遵循这种模式,但想知道是否有区别。
不,没有区别。使用const
关键字,它可以应用于声明中的多种事物;它可以应用于指针,也可以应用于被指向的值。
所有权限定符仅对指向对象的指针有意义。对象本身不能是“强”或“弱”;它是指向强或弱对象的指针。ARC 仅在直接应用于指向对象的类型时才有意义,并且会影响指针的生命周期将如何影响对象的生命周期。
鉴于所有权限定符可以应用于什么从来没有任何歧义,ARC 规范允许将所有权限定符放置在指向对象的定义中的任何位置。你的两个例子同样有效。同样,以下所有含义都相同:
NSError * __autoreleasing * someObject;
NSError __autoreleasing ** someObject;
__autoreleasing NSError ** someObject;
请注意,编译器会抱怨这一点,但是:
NSError ** __autoreleasing someObject;
这是因为您已经超出了指向对象的定义。您可以将其解析为(NSError *)* __autoreleasing someObject;
. 当你到达 second*
时,你已经定义了指针的类型,所以__autoreleasing
没有任何意义。指针类型定义中的任何地方都可以,但是一旦您转到指针到指针类型,那么您指的是其他东西,它不再有意义。
如果你有,那就有区别了
__weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing;
因为 __weak 只会混淆地应用于第一个变量。(这是和菜鸟类似的错误
NSObject* one, two;
这当然也不会像“预期的”那样工作)。