【发布时间】:2016-08-20 10:00:03
【问题描述】:
有一种方法:
- (void)doSmth:(NSString *__strong*)str {
NSLog(@"%@", *str);
}
__strong 跟在方法参数的类后面是什么意思?为什么有两个星号?
【问题讨论】:
标签: objective-c
有一种方法:
- (void)doSmth:(NSString *__strong*)str {
NSLog(@"%@", *str);
}
__strong 跟在方法参数的类后面是什么意思?为什么有两个星号?
【问题讨论】:
标签: objective-c
两个星号表示它是一个指向指针的指针。
__strong 与您可能已经知道的__weak 相反。这意味着我们在这里谈论的是一个强有力的参考。当我们持有该引用时,该对象不会被释放。
我们还需要知道写__strong Type *varName 在技术上是错误的(尽管它有效并且几乎每个人都使用它)。正确的语法是Type * __strong varName。
您的语法是指向NSString 的强引用的指针。这意味着当从方法返回一个对象时,必须有来自 ARC 的 release 调用才能正确释放该对象。
请查看相关问题: NSError and __autoreleasing 和官方文档: Transitioning to ARC
【讨论】:
虽然这个问题已经有了答案,但人们需要知道确切的词或最简单的描述。
__strong
只要有指向它的强指针,对象就会保持“活动”。
当一个对象被分配给该指针时,只要该指针引用它,它就会被保留
当您想确保您所引用的对象在您仍在使用时不会被释放。
上面的点是__strong的意思。
The Best Example of __strong from BJ Homer
这里的狗是一个对象,狗想逃跑(被释放)。
强指针就像狗的皮带。只要你有 拴在狗身上的皮带,狗不会逃跑。如果五个人 将他们的皮带拴在一只狗上,(五个强指针指向一个物体), 那么在所有五根皮带都松开之前,狗不会逃跑。
另一方面,弱指针就像小孩子指着 狗说:“看!一条狗!”只要狗还在 皮带,小孩子仍然可以看到狗,他们仍然会指向 给它。但是,只要松开所有的皮带,狗就会跑 不管有多少小孩指向它。
只要最后一个强指针(皮带)不再指向 对象,对象将被释放,所有弱指针都将被释放 归零。
两个星号
它是指向指针的指针
如果你使用指向指针的指针,你必须像 Sulthan 所说的那样当一个对象从该方法返回时,必须有来自 ARC 的释放调用才能正确释放该对象。 所以我们要知道指针的使用方式
Here is the way for Handling pointer to pointer ownership issues
【讨论】: