[英]strong, weak, and id
我在iOS 3.0推出时就进行了一些iOS
开发,但是两年来我一直没有跟踪iOS的运行情况。
我记得您确实会保留在iOS
3.0中,即使如此,我仍然不记得确切地保留在setter中的原因是什么。 到目前为止,这只是困扰我的一件事。
最后但并非最不重要的一点是,在带有ARC的iOS 5中,默认情况下局部变量是强的。 如果其中一些没有二传手,他们怎么能坚强呢? (例如,id。)
一些代码来解释我的意思:
+(double) popOperandOffStack:(NSMutableArray *) stack{
double result = 0;
id topOfStack = [stack lastObject];
// how is topOfStack retaining [stack lastObject] if it's simply id?
if (topOfStack) [stack removeLastObject];
if ([topOfStack isKindOfClass:[NSNumber class]]){
result = [topOfStack doubleValue];
}
else if ([topOfStack isKindOfClass:[NSString class]]){
if ([topOfStack isEqualToString:@"+"]){
result = [self popOperandOffStack:stack] + [self popOperandOffStack:stack];
}
if ([topOfStack isEqualToString:@"-"]){
result = [self popOperandOffStack:stack] - [self popOperandOffStack:stack];
}
if ([topOfStack isEqualToString:@"*"]){
result = [self popOperandOffStack:stack] * [self popOperandOffStack:stack];
}
if ([topOfStack isEqualToString:@"/"]){
result = [self popOperandOffStack:stack] / [self popOperandOffStack:stack];
}
}
return result;
}
您可以在编译时向对象发送消息而无需知道它们的确切类型。 实际上,当您向从数组中获取的对象发送消息时,通常会这样做:您不需要将id
转换为确切的类型,只需发送一条消息,Objective C就会正确地分派它。 该规则的唯一例外是使用点号访问属性.
语法:您确实需要在其中进行强制转换。
每个对象的类继承自NSObject
响应retain
, release
, autorelease
,等等。 这就是ARC需要知道的一切。 在最坏的情况下,如果您碰巧指向一个无效的id
,则会收到“对象不响应选择器”消息。
您似乎将属性与实例变量和局部变量混淆了。
变量没有设置器。 属性有setter。 任何类型的属性都可以具有setter(可能为空)。 实例变量可能恰好与属性相对应,但是变量本身没有“ setter”。 obj->ivar
将永远不会调用setter, 即使在ARC下也是如此 。
ARC仅做大约三件事:
为您插入retain
, release
, autorelease
和dealloc
。 当你写
// ARC { id foo = [array lastObject]; ... }
它被翻译成大约
// MRC { id foo = [[array lastObject] retain]; ... [foo release]; }
它使用Objective-C命名约定确定需要保留和释放的内容。 有一些优化(出于ARC规范中所述的原因,它实际上使用了objc_retain()
和friends,另外还有一些功能比-autorelease
更有效地处理自动发布的对象)。
为您释放__strong
__strong -dealloc
。 它不调用属性设置器。 它只是释放了ivars。 它还可能会将它们设置为nil
。
归零弱引用。 __weak
变量是使用objc_copyWeak()
和朋友读取/写入的,而不是直接访问的。 -[NSObject release]
还有一个钩子(或如此),以便正确实现对弱引用的清零。
此外,围绕块和__block
变量的语义以不容易通过MRC复制的方式进行更改。 除此之外,我相信可以通过调用ARC运行时支持函数调用来复制ARC所做的所有事情。
ARC和设置器之间的唯一联系是,您可以摆脱很多属性,因为编译器在ivar访问时插入了“保留/释放”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.