簡體   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