Я вижу интересное поведение, когда использую iOS 5 и Xcode 4.2.У меня есть одноэлементный класс, который содержит переменную UIImage и переменную NSString, но по какой-то причине переменная UIImage никогда не сохраняется, хотя я использую свойства.Я использовал этот же код для синглетонов в других проектах, и он всегда работал нормально, но в iOS 5 он работает некорректно. И, кстати, я НЕ использую ARC.
Вот пример того, чтоЗаголовочный файл выглядит так:
@interface MYSingleton : NSObject {
NSString *aString;
UIImage *anImage;
}
@property (nonatomic, retain) NSString *aString;
@property (nonatomic, retain) UIImage *anImage;
+ (MYSingleton *) instance;
@end
А вот соответствующий файл реализации:
@implementation MYSingleton
static MYSingleton *instance = nil;
@synthesize aString, anImage;
- (void) dealloc {
[aString release];
[anImage release];
[super dealloc];
}
+ (MYSingleton *) instance {
@synchronized(self) {
if (instance == nil) {
[[MYSingleton alloc] init]; // assignment not done here
}
}
return instance;
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (instance == nil) {
instance = [super allocWithZone:zone];
return instance;
}
}
return nil;
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX;
}
- (void)release {
// do nothing
}
- (id)autorelease {
return self;
}
@end
По многочисленным просьбам, вот как я присваиваю значение переменной UIImage:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
id image = [info objectForKey:UIImagePickerControllerOriginalImage];
MYSingleton *m = [MYSingleton instance];
m.anImage = image
}
Я также заметил, возможно, связанную разницу в iOS 5, но с категорией, которую я создал.Эта категория была для UIDevice.Я добавил метод, который возвращал платформу в виде строки.Я кэширую строку в статической переменной, которую я объявил в верхней части файла реализации категории.Когда метод был впервые назван статической переменной, он равен nil, поэтому значение вычисляется и сохраняется в статической переменной.При последующих вызовах метода возвращается кэшированная переменная.Это работало нормально в iOS 4, но в 5, когда когда-либо этот метод вызывался более одного раза, выдается ошибка EXEC_BAD_ACCESS (кроме случаев, когда я прохожу код).
Любая помощь очень ценится.