2014-10-07 4 views
7

użyciu wzorca weakSelf/strongSelf uniknąć tworzenia utrzymanie cyklu w blokach, to kod jest bardzo częste:Stosując typeof (samodzielne) w blokach celu C do stwierdzenia, czy wyraźne odniesienie

typeof(self) __weak weakSelf = self; 
void (^block)() = ^{ 
    typeof(weakSelf) strongSelf = weakSelf; 
    // ...more code... 
}; 

Chodzi o to, zmienia drugą wartość, która ma zostać przechwycona w bloku?

Na przykład:

typeof(self) __weak weakSelf = self; 
void (^block)() = ^{ 
    typeof(self) strongSelf = weakSelf; // does using typeof(self) here end up capturing self? 
    // ...more code... 
}; 

Jeśli samo nie jest zrobione, nie ma żadnych powodów, aby preferują jedną lub drugą stronę?

Odpowiedz

4

Nie dotyczy. To, co Ken powiedział o typeof, jest wyrażeniem czasu kompilacji.

Także oto kawałek kodu, który to potwierdza:

#import <Foundation/Foundation.h> 

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
    NSObject *o = [NSObject new]; 

    __weak typeof(o) weakO = o; 
    void(^b)() = ^{ 
     __strong typeof(o) strongO = weakO; 
     NSLog(@"o: %@", strongO); 
    }; 

    o = nil; 
    b(); 
    /* outputs: 
     2015-05-15 16:52:09.225 Untitled[28092:2051417] o: (null) 
    */ 
    } 
} 
+0

Czy znasz sposób, aby przekonwertować go z powrotem na silny? Próbowałem __strong typeof (weakSelf) strongSelf = weakSelf; i nie zadziałało, zostało zwolnione, ponieważ nadal musi być słabe. Powodem, dla którego pytam, jest to, że nie używam siebie, potrzebuję go do bloku, ale jako obejście mogę po prostu zdefiniować pełny typ. – malhal

8

Nie należy. Jeśli tak, jest to błąd kompilatora.

Wyrażenie typeof w rzeczywistości nie odnosi się do zmiennej self lub jej wartości. Jest to ściśle odniesienie do typu wyrażenia, a nie jego wartości. Wyrażenie jest ściśle konstruktem kompilacji, który nie przeżyje skompilowanego kodu.

Ja osobiście wolałbym typeof(self), ale nie sądzę, że istnieje silny argument przemawiający za preferowaniem jednego lub drugiego.

+0

Nie to, że nie wierzę, ale byłoby miło mieć jakieś dowody do tworzenia kopii zapasowych, co myślisz. – smileyborg