__strong和__weak关键字放置 - Objective-C

ede*_*y05 8 objective-c-2.0 automatic-ref-counting

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

NSObject * __weak weakThing;
__weak NSObject *anotherWeakThing;
Run Code Online (Sandbox Code Playgroud)

这两者有区别吗?行为是否像const关键字一样

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

SomeDataType*__weak/__strong

......当你搞砸了什么.所以我试图遵循这种模式,但想知道是否存在差异.

BJ *_*mer 13

不,没有区别.使用const关键字,可以在声明中应用多种内容; 它可以应用于指针,或者它可以应用于指向的值.

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

鉴于所有权限定符可以应用的内容从不存在任何歧义,ARC规范允许将所有权限定符放置在指向对象的指针的任何位置.您的两个示例都同样有效.同样,以下所有意味着同样的事情:

NSError * __autoreleasing * someObject;
NSError __autoreleasing ** someObject;
__autoreleasing NSError ** someObject;
Run Code Online (Sandbox Code Playgroud)

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

NSError ** __autoreleasing someObject;
Run Code Online (Sandbox Code Playgroud)

这是因为你已经超越了指向对象的定义.你可以解析那个(NSError *)* __autoreleasing someObject;.当你到达第二个时*,你已经定义了指针的类型,所以__autoreleasing没有任何意义.指针类型定义中的任何位置都可以,但是一旦你移动到指针指针类型,那么你指的是其他东西,它就没有意义了.


mar*_*man 6

还有就是如果你有一个差异

 __weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing;
Run Code Online (Sandbox Code Playgroud)

因为__weak只会混淆地应用于第一个变量.(这对新秀来说也是一个类似的错误

NSObject* one, two;
Run Code Online (Sandbox Code Playgroud)

这当然不会像"预期的"那样工作.