1. Objective C / Говнокод #13893

    −124

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    recognizer = [SMRecognizerConvNet alloc];
            
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                                     (unsigned long)NULL), ^(void) {
                recognizer = [recognizer init];
                loaded = true;
                
                DLog(@"recognizer loaded");
            });

    Спонадобилось воскресить один старый проект, а там нашлось такое...

    Запостил: tirinox, 04 Октября 2013

    Комментарии (6) RSS

    • показать все, что скрытоОтсосу у парня из Владикавказа [email protected] :-D
      Ответить
    • Отлично вообще, поди по всему классу расставлены проверки
      if (!loaded)
      {
      // Okay :(
      }
      Ответить
      • Хуже то, что объект аллочится сразу, а инициализируется где-то когда-то асинхронно, при этом он продолжает быть доступен все это время неинициализированным.

        И да, проверки есть :)
        Ответить
        • А можно код этого init'а выложить, чую что не просто так его асинхронно запускать решили, может там не менее эпичный говнокод?
          Ответить
          • Говно, конечно, но не такое. По сути тупо загрузка большого файла. И зачем пришло в голову мешать C++ и Obj-C?...
            SMNeuralNetwork *LoadNetwork(NSString *fileName)
            {
                NSBundle *b = [NSBundle mainBundle];
                NSString *dir = [b resourcePath];
                NSArray *parts = [NSArray arrayWithObjects:
                                  dir, fileName, (void *)nil];
                NSString *path = [NSString pathWithComponents:parts];
                const char *cpath = [path fileSystemRepresentation];
                
                SMNeuralNetwork *net = [SMNeuralNetwork neuralNetwork];
                
                std::ifstream stream(cpath, std::ios::binary | std::ios::in);
                [net loadFromBinaryStream:stream];
                stream.close();
            
                
                return net;
            }
            
            @implementation SMRecognizerConvNet
            
            - (id) init
            {
                if((self = [super init]))
                {
                    result = -1;
                    
                    dataSize = 4 * SM_TEXTURE_H * SM_TEXTURE_W * sizeof(ccColor4B) * CC_CONTENT_SCALE_FACTOR() * CC_CONTENT_SCALE_FACTOR();
                    inputBuffer = (ccColor4B *) malloc(dataSize);
                    memset(inputBuffer, 0, dataSize);
            
                    [self randomizeNet];
                    netw = [LoadNetwork(@"neural-net.bin") retain];
                }
                return self;
            }
            Ответить
            • Да тут целая кунсткамера! Есть и char * строки, и кастование nil в void * (зачем?) и передача этого добра в NSArray, и C++ iostream.
              А что касается метода init, то более извращенного способа загрузить картинку в cocos2d даже представить трудно! Причем автор учел и ретина разрешение, и позаботился о количестве бит на пиксель (хотя эта проверка сделана неправильно и выглядит глупо, я про sizeof(ccColor4B)).
              Хоть метод init и содержит только выделение памяти под эту картинку, могу предположить, что непосредственно загрузка происходит считыванием картинки с диска побайтно.
              Метод LoadNetwork реализован вне класса как C функция, что тоже мягко говоря не хорошо, на крайний случай можно было и статическим методом сделать, но внутри класса.
              И на последок, retain результата C функции, хоть формально и верно, но от этого не легче.
              Мда...
              Ответить

    Добавить комментарий