Nasıl @kilit senkronize/Objective-C kilidini mı?
@Senkronize" ve "karşılıklı dışlama elde etmek için? kilidini "lock kullanmak değil mi Nasıl kilit/kilidini sonra mı?
Aşağıdaki programın çıktısı sadece "Merhaba Dünya".
@interface MyLock: NSLock<NSLocking>
@end
@implementation MyLock
- (id)init {
return [super init];
}
- (void)lock {
NSLog(@"before lock");
[super lock];
NSLog(@"after lock");
}
- (void)unlock {
NSLog(@"before unlock");
[super unlock];
NSLog(@"after unlock");
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MyLock *lock = [[MyLock new] autorelease];
@synchronized(lock) {
NSLog(@"Hello World");
}
[pool drain];
}
CEVAP
Objective-C dil seviyesi senkronizasyon NSLock yaptığı gibi, zaman uyumu kullanır. Anlamsal bazı küçük teknik farklılıklar vardır, ama iki ayrı arayüzleri (daha fazla) ilkel ortak bir varlık üzerine uygulanan olarak düşünmek temelde doğru.
@synchronized oysa açık bir Kilidi var NSLock ile özellikle örtülü bir kilit eşitlemek için kullandığınız nesne ile ilişkili vardır. Dil düzeyi yararı kilitleme derleyici kapsayan konularda ki anlar, ama mekanik olarak onlar temelde aynı şekilde davranır.
Bir derleyici olarak @synchronized düşün yeniden yazabilirsiniz:
- (NSString *)myString {
@synchronized(self) {
return [[myString retain] autorelease];
}
}
dönüşür:
- (NSString *)myString {
NSString *retval = nil;
pthread_mutex_t *self_mutex = LOOK_UP_MUTEX(self);
pthread_mutex_lock(self_mutex);
retval = [[myString retain] autorelease];
pthread_mutex_unlock(self_mutex);
return retval;
}
Bu gerçek bir dönüşüm daha karmaşık ve özyinelemeli kilitleri kullanır, çünkü tam olarak doğru değil, ama genelinde noktası almak gerekir.

Nasıl bir dize Objective-C başka bir d...
Nasıl Objective-C temsilciler oluştura...
Objective-C, nesne türü nasıl test ede...
Nasıl Objective C, Swift kodu arama...
Nasıl MonoTouch ve Objective-C arasınd...