Не все языки имеют понятие неподписанного ints. Например, VB 6 не имел никакого понятия неподписанного ints, который я подозреваю, управлял решением разработчиков VB7/7.1 для не реализации также (это реализовано теперь в VB8).
Для заключения в кавычки:
http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx
CLS был разработан, чтобы быть достаточно большим для включения конструкций языка, которые обычно необходимы разработчикам, все же достаточно маленьким, что большинство языков в состоянии поддерживать его. Кроме того, любая конструкция языка, которая лишает возможности быстро проверять безопасность типов кода, была исключена из CLS так, чтобы все CLS-совместимые языки могли произвести верифицируемый код, если они принимают решение сделать так.
Обновление: Я действительно задавался вопросом об этих некоторых годы назад, и пока я не вижу, почему UInt не был бы поддающейся проверке безопасностью типов, я предполагаю, что у парней CLS должно было быть пороговое значение где-нибудь относительно того, что будет базовым минимальным количеством поддерживаемых типов значения. Также, когда Вы думаете о долгосрочной перспективе, где все больше языков портируется к CLR, почему вынуждают их реализовать неподписанный ints для получения совместимости с CLS, если нет абсолютно никакого понятия, никогда?
Делегат приложения - подходящее место для его размещения. Другой вариант - создать собственный одноэлементный фабричный класс, который имеет метод класса, который возвращает делегат вашего диспетчера местоположения, и реализует там методы делегата. Это позволит сохранить чистоту класса делегата вашего приложения.
Вот скелетная реализация класса синглтона, основанная на Питера Хози «Синглтоны в какао: делать их неправильно» . Это может быть излишним, но это только начало. Добавьте свои методы делегата в конце.
static MyCLLocationManagerDelegate *sharedInstance = nil;
+ (void)initialize {
if (sharedInstance == nil)
sharedInstance = [[self alloc] init];
}
+ (id)sharedMyCLLocationManagerDelegate {
//Already set by +initialize.
return sharedInstance;
}
+ (id)allocWithZone:(NSZone*)zone {
//Usually already set by +initialize.
@synchronized(self) {
if (sharedInstance) {
//The caller expects to receive a new object, so implicitly retain it
//to balance out the eventual release message.
return [sharedInstance retain];
} else {
//When not already set, +initialize is our caller.
//It's creating the shared instance, let this go through.
return [super allocWithZone:zone];
}
}
}
- (id)init {
//If sharedInstance is nil, +initialize is our caller, so initialze the instance.
//If it is not nil, simply return the instance without re-initializing it.
if (sharedInstance == nil) {
if ((self = [super init])) {
//Initialize the instance here.
}
}
return self;
}
- (id)copyWithZone:(NSZone*)zone {
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX; // denotes an object that cannot be released
}
- (void)release {
// do nothing
}
- (id)autorelease {
return self;
}
#pragma mark -
#pragma mark CLLLocationManagerDelegateMethods go here...