Nano Hash - криптовалюты, майнинг, программирование

Сообщение отправлено на удаленный экземпляр Насколько я могу судить, нет причин, по которым его следует освобождать

Я работаю над приложением для Iphone, которое использует базу данных SQLite в качестве основного источника данных модели.

Когда приложение открывается, одноэлементный объект под названием «Модель» сканирует таблицу SQLite, использует каждую строку для создания объекта «Результат» (подкласс NSObject), а затем добавляет каждый Результат в NSMutableArray.

Вот код этого раздела, который начинается сразу после того, как я нашел путь к базе данных:

- (void)populateResultArrayWith:(NSString *)dbPath {

const char *sql = "SELECT * FROM results";
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

    while(sqlite3_step(selectstmt) == SQLITE_ROW) {

        NSInteger pkInt = sqlite3_column_int(selectstmt, 0);
        NSNumber *pk = [NSNumber numberWithInt:pkInt];
        NSString *v = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
        NSString *n = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
        NSString *s = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];
        NSNumber *c = [NSNumber numberWithFloat:(float)sqlite3_column_double(selectstmt, 4)];
        NSString *t1 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 5)];
        NSString *t2 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];
        NSString *t3 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 7)];

        Result *resultObj = [[Result alloc] initWithPrimaryKey:(NSNumber *)pk
                                                      withVerb:(NSString *)v
                                                      withNoun:(NSString *)n
                                                    withSuffix:(NSString *)s
                                                      withCost:(NSNumber *)c
                                                      withTag1:(NSString *)t1
                                                      withTag2:(NSString *)t2
                                                       andTag3:(NSString *)t3];

        [self.resultArray addObject:resultObj];
        [resultObj release];
    }
}
else
    sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
    NSLog(@"Model: Closing Database");
}

Позже один из моих контроллеров представления сообщает моей модели запустить повторяющийся NSTimer и запускает метод для генерации случайного результата из NSMutableArray:

-(void)startTimer
{
if (startDate && startDate != nil) {
    startDate = nil;
}
self.modelCumulativeValueWasted = 0;
startDate = [[NSDate date] retain];
modelTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/1.0) 
                                         target:self
                                       selector:@selector(tick) 
                                       userInfo:nil
                                             repeats:YES];
[self randomResult];
}

И:

-(Result *)randomResult
{
if (randomResult != nil) {
    randomResult=nil;
}

NSLog(@"Selected Result Retain Count At Beginning of Method = %i", [randomResult retainCount]);
// Generate a random int between 0 and the total count of the resultArray.
int randomIndex = arc4random() % [resultArray count];

// Select a result from the resultArray at that index - with an iVar.
randomResult = [resultArray objectAtIndex:randomIndex];
NSLog(@"Selected Result Retain Count At End of Method= %i", [randomResult retainCount]);

return randomResult;
}

Показания консоли говорят мне, что счетчик удержания является нормальным в ходе этого метода ... randomResult начинается с счетчика удержания 0 после открывающего оператора if / then и счетчика удержания 1 после его возврата.

Затем моя модель применяет некоторые вычисления на основе других данных модели для создания отформатированной строки результата для отображения в представлении:

-(void)calculateQuantity
{
    // Get the float of the randomly selected result's "cost" property.
    selectedCostFloat = [randomResult.cost floatValue];

    // Calculate "how many of this result item could we buy" by dividing the cumulativeValueWasted by the costFloat.
    float quantityFloat = (modelCumulativeValueWasted / selectedCostFloat);
    NSLog(@"Quantity Float = %f", quantityFloat);
    // Save this float as an NSNumber object, so a NSNumberFormatter can interpret it in ResultVC.
    quantityNumber = [NSNumber numberWithFloat:quantityFloat];
}

Моя проблема в том, что каждый раз, когда вызывается этот метод, и моя модель пытается получить floatValue свойства NSNumber * cost, я получаю сбой (используя точки останова, я изолировал первую строку calculateQuantity: как точка сбоя), и я получаю в консоли следующее сообщение:

- [CFNumber floatValue]: сообщение отправлено освобожденному экземпляру 0x6332280

Это работает следующим образом: [sharedModel calculateQuantity]; вызывается при первом такте таймера, а затем происходит сбой:

-(void)tick
{
// For "Time" every tick
NSDate *currentDate = [NSDate date];
NSTimeInterval countInSeconds = [currentDate timeIntervalSinceDate:startDate];

[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

NSDate *modelTimerDate = [NSDate dateWithTimeIntervalSinceReferenceDate:countInSeconds];
self.modelTimeString = [df stringFromDate:modelTimerDate];
NSLog(@"Time String: %@",self.modelTimeString);

//For "$" every tick
self.modelCumulativeValueWasted += self.modelMeetingValuePerSecond;

self.modelNumberToDisplayString = [NSString stringWithFormat:@"$%1.2f",self.modelCumulativeValueWasted];
NSLog(@"Cumulative Money Wasted: %@",self.modelNumberToDisplayString);

[self calculateQuantity];
}

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

Самая запутанная часть состоит в том, что если я переместу первые пару строк метода calculateQuantity в конец метода randomResult, я все равно получу сбой. Даже после того, как консоль ТОЛЬКО сообщила мне, что счетчик сохраненных данных равен 1, она сразу же сообщает, что я пытаюсь отправить сообщение освобожденному экземпляру.

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


  • Как написан метод initWith** Result? 22.06.2011

Ответы:


1

Во-первых, никогда не полагайтесь на -retainCount, поскольку система может творить с ним чудеса.

Во-вторых, randomResult - это возврат от resultArray, поэтому владельцем randomResult является resultArray, вы не знаете, когда владелец освободит своего члена. Чтобы владеть объектом самостоятельно, вы должны отправить ему -retain сообщение, поэтому измените его на

-(Result *)randomResult
{
  ...
  randomResult = [resultArray objectAtIndex:randomIndex];    
  return [[randomResult retain] autorelease];
}

Должно быть хорошо. Попробуйте.

22.06.2011
  • Это была отличная идея - я считаю, что это было решение. Я также посмотрел на свой метод Result Init. Оказалось, что я сделал большой надзор за управлением памятью и ввел такие свойства - ›verb = aVerb, noun = aNoun и т. Д., Когда я должен был использовать -› self.verb = aVerb, self.noun = aNoun. Я считаю, что это имело большое значение! 23.06.2011
  • О ... и другой большой проблемой был мой собственный метод получения для - (Result *) randomResult вызывался объектами, просто пытающимися ссылаться на его свойства, например sharedModel.randomResult.cost. Когда это было вызвано, мой метод получения вступил в силу, и был сгенерирован новый случайный результат, который все испортил. Я изменил этот метод на - (void) generateRandomResult вместо этого, чтобы очистить его 23.06.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..