Цель C - освобожденная переменная - PullRequest
1 голос
/ 02 сентября 2011

У меня есть класс static / singelton, в котором есть переменная-член.

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

Я попытался повторно инициализировать переменную-член, но, похоже, не сработал.

Я включил примеры моего кода ниже, кто-нибудь видел это раньше?

Файл заголовка (.h):

@interface Metrics : NSObject {
Metrics *metrics;
Distance *distance;
}

Файл реализации (.m):

@implementation Metrics

static Metrics *metrics = nil;

+ (Metrics *)sharedInstance {
@synchronized(self) {
    if (metrics == nil) {
        metrics = [[Metrics alloc] init];
    }   
}

return metrics;
}

- (id)init {
    self = [super init];

    if (self) {

    }

    return self;
}

-(void) setupDistance
{
    distance = [[Distance alloc] init];
    distance.test; // it dies here after I quit the app and come back
}

И где это используется, AppDelegate.m

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [[Metrics sharedInstance] setupDistance];
}

Спасибо,
Тройник

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

applicationDidBecomeActive будет вызван, когда он вернется из режима ожидания, снова установив дистанцию.Странно, что вы вызываете свойство (.test), а не присваиваете.Тест выполняет работу?Это должен быть метод?Что он делает?

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

 static MySingleton *sharedInstance = nil;

 @implementation MySingleton

 #pragma mark -
 #pragma mark class instance methods

 #pragma mark -
 #pragma mark Singleton methods

+ (MySingleton*)sharedInstance
{
    @synchronized(self)
    {
        if (sharedInstance == nil)
            sharedInstance = [[MySingleton alloc] init];
    }
    return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [super allocWithZone:zone];

        return sharedInstance;  // assignment and return on first allocation

        }
    }

    return nil; // on subsequent allocation attempts return nil
}

- (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;
}

@end
1 голос
/ 02 сентября 2011

Когда вы говорите «выйти из приложения», вы почти наверняка имеете в виду «отправить приложение в фоновый режим».Это не прекращает вашу заявку.Когда вы снова становитесь активными, вы пропускаете distance и назначаете новый.Я подозреваю, что что-то в test на самом деле является проблемой.

Во-первых, не обращайтесь напрямую к своим иварам, кроме как в init и dealloc.Используйте аксессоры.Это устранит большинство ваших проблем.

Во-вторых, не звоните setupDistance в applicationDidBecomeActive.Вы хотите назвать это в applicationDidFinishLaunchingWithOptions:.Но еще лучше, просто инициализируйте его во время Metrics init.Почему эта внутренняя Metrics деталь в делегате приложения?

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