繁体   English   中英

强,弱和内在

[英]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响应retainreleaseautorelease ,等等。 这就是ARC需要知道的一切。 在最坏的情况下,如果您碰巧指向一个无效的id ,则会收到“对象不响应选择器”消息。

您似乎将属性与实例变量和局部变量混淆了。

变量没有设置器。 属性有setter。 任何类型的属性可以具有setter(可能为空)。 实例变量可能恰好与属性相对应,但是变量本身没有“ setter”。 obj->ivar将永远不会调用setter, 即使在ARC下也是如此

ARC仅做大约三件事:

  1. 为您插入retainreleaseautoreleasedealloc 当你写

     // ARC { id foo = [array lastObject]; ... } 

    它被翻译成大约

     // MRC { id foo = [[array lastObject] retain]; ... [foo release]; } 

    它使用Objective-C命名约定确定需要保留和释放的内容。 有一些优化(出于ARC规范中所述的原因,它实际上使用了objc_retain()和friends,另外还有一些功能比-autorelease更有效地处理自动发布的对象)。

  2. 为您释放__strong __strong -dealloc 它不调用属性设置器。 它只是释放了ivars。 它还可能会将它们设置为nil

  3. 归零弱引用。 __weak变量是使用objc_copyWeak()和朋友读取/写入的,而不是直接访问的。 -[NSObject release]还有一个钩子(或如此),以便正确实现对弱引用的清零。

此外,围绕块和__block变量的语义以不容易通过MRC复制的方式进行更改。 除此之外,我相信可以通过调用ARC运行时支持函数调用来复制ARC所做的所有事情。

ARC和设置器之间的唯一联系是,您可以摆脱很多属性,因为编译器在ivar访问时插入了“保留/释放”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM