objective c - 自動引用計數:快速枚舉時出錯




objective-c ios (2)

您需要將緩衝區更改為__unsafe_unretained

- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state
                                   objects: (id __unsafe_unretained *)buffer
                                     count: (NSUInteger)bufferSize

資源

編輯:簡單的方法來擺脫mutationPtr中的錯誤:

state->mutationsPtr = &state->extra[0];

在更新下面的代碼以使用iOS 5自動引用計數時,當嘗試執行快速枚舉時將“state-> itemPtr”分配給緩衝區時會發生錯誤,以便可以使用“foreach”循環迭代實現類。 我得到的錯誤是“指定'__autoreleasing id *'為'__unsafe_unretained id *'更改指針保留/釋放屬性”。 查看帶註釋的代碼行。

/*
 * @see http://cocoawithlove.com/2008/05/implementing-countbyenumeratingwithstat.html
 * @see http://www.mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html
 */
- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (id *)buffer count: (NSUInteger)bufferSize {
    NSUInteger arrayIndex = (NSUInteger)state->state;
    NSUInteger arraySize = [_tuples count];
    NSUInteger bufferIndex = 0;

    while ((arrayIndex < arraySize) && (bufferIndex < bufferSize)) {
        buffer[bufferIndex] = [_tuples objectAtIndex: arrayIndex];
        arrayIndex++;
        bufferIndex++;
    }

    state->state = (unsigned long)arrayIndex;
    state->itemsPtr = buffer; // Assigning '__autoreleasing id *' to '__unsafe_unretained id*' changes retain/release properties of pointer
    state->mutationsPtr = (unsigned long *)self;

    return bufferIndex;
}

本例中的_tuples變量是一個NSMutableArray類型的實例變量。

我該如何解決這個錯誤?


Ziminji,

我遇到了同樣的問題,這就是我遇到這個問題的原因。

我通過保持 objects參數的定義(如保持為id * )來解決這個問題,而是使用void指針來進行雙重轉換。

所以,雖然這給我產生了錯誤:

state->itemsPtr = (__unsafe_unretained id *)buffer  // Error

這工作很好:

state->itemsPtr = (__unsafe_unretained id *)(void *)buffer  // No error

免責聲明:我不是ARC專家,我不能保證,這不會引起問題引用計數。 但是,它似乎在我的測試中正常工作,它肯定編譯沒有警告。

順便說一下,我遇到了這個兩部分的博客文章,其中涵蓋了很多深度的快速枚舉:

還有__unsafe_unretained這個博客條目:





automatic-ref-counting