iOS 5: некоторые ссылки не сохраняются - PullRequest
0 голосов
/ 17 ноября 2011

Я вижу интересное поведение, когда использую 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 (кроме случаев, когда я прохожу код).

Любая помощь очень ценится.

1 Ответ

1 голос
/ 17 ноября 2011

Во-первых, этот синглтон - это чепуха (Да, я знаю, что это из документов - все еще чепуха).Если вы хотите реализовать синглтон, просто выполните:

@implementation MYSingleton
+ (id)sharedInstance
{
     static MYSingleton *instance = nil;
     static dispatch_once_t once;
     dispatch_once(&once, ^{
          instance = [[self alloc] init]; 
     });
     return instance;
}
... etc ...
@end

Все остальное - пустая трата текста.

Во-вторых, вы не показываете код, связанный с вещью.это сбой.Однако лучше всего предположить, что у вас есть код, который выполняет:

anImage = [... some random method that returns an image....];

Когда вы действительно имели в виду:

self.anImage = [ ... ];

То есть вы не используете сеттер и изображениене сохраняетсяМожет быть, это было изменение, которое вы внесли недавно.Возможно, изображение было одиночным в предыдущих выпусках из-за кэширования.

Трудно сказать, не видя больше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...