Свойство IOS NSString всегда равно нулю в ссылочном классе

Вот мой @interface def;

@interface Thumbnail : UIView <NSCoding>{
    NSMutableString *imageCacheKeyBase;
}
@property (nonatomic, copy) NSMutableString  *imageCacheKeyBase;
@end

Вот моя @implementation:

@synthesize imageCacheKeyBase;

Затем в методе initWithAsset класса Thumbnail:

self.urlString = [[_asset.defaultRepresentation.url absoluteString] copy];
c  = (char*)[urlString UTF8String];

while (*c != '=') 
    ++c;
++c;

self.imageCacheKeyBase = [NSString stringWithFormat:@"%s_", c];

И поэтому, когда класс выделения Thumbnail пытается сослаться на thumbnail.imageCacheKeyBase, вонючая вещь равна нулю. Я пробовал миллион различных подходов к тому, чтобы строковая переменная оставалась свойством thumbnail. Я даже пробовал просто self.imageCacheKeyBase = @"dave". Ничего. Я пытался сохранить и сохранить сохранить (я знаю, что это глупо, но я пробовал что угодно. Я даже пытался просто сделать свойство char *.

Я исследовал это весь день.

Помогите, пожалуйста.


person user953175    schedule 19.04.2012    source источник


Ответы (2)


Где-то внизу что-то нулевое. попробуйте NSLogging значения каждого объекта или типа данных.

NSLog(@"My first string is %@, the char is %s, the final string is %@", [_asset.defaultRepresentation.url absoluteString], c, self.imageCacheKeyBase);
person CodaFi    schedule 19.04.2012
comment
Ну, в последний раз я проверял, что строка c ЯВЛЯЕТСЯ символом *. %s и char * идут вместе, как арахисовое масло и желе, с тех пор, как Керниган и Ричи придумали язык c. Однако я полагаю, что мой пост может ввести в заблуждение. c объявлен как char *c; Вы упомянули, что видели другие проблемы. Как что? - person user953175; 19.04.2012

Похоже, вы пытаетесь получить все, включая = во входном URL-адресе. Я бы предложил вместо преобразования в строку UTF-8 (если у вас нет веской причины сделать это, о чем вы не упомянули), вы делаете что-то вроде:

self.urlString = [[_asset.defaultRepresentation.url absoluteString] copy];

NSRange range = [self.urlString rangeOfString@"="];
if (range.location != NSNotFound)
{
    self.imageCacheKeyBase = [NSString stringWithFormat:@"%s=", [self.urlString subStringToIndex:range.location];
}

Я бы также объявил imageCacheKeyBase в .h следующим образом:

@property (nonatomic, retain) NSString *imageCacheKeyBase;

если вам не нужно, чтобы он был изменчивым. Если вам нужно, чтобы он был изменяемым, то в моем фрагменте выше измените [NSString stringWithFormat... на [NSMutableString stringWithFormat.... Поскольку вы создаете строку в этом классе, вам просто нужно сохранить ее, что предпочтительнее скопировать.

Кроме того, вы ссылаетесь на self.urlString в своем фрагменте кода, но он не объявлен в файле @interface. Может быть, вы просто хотите, чтобы это была временная локальная переменная, пока вы создаете imageCacheKeyBase? Если это так, измените первую строку в моем фрагменте выше на:

NSString* urlString = [_asset.defaultRepresentation.url absoluteString];

absoluteString возвращает строку автоматического освобождения, поэтому ее не нужно освобождать.

person Rob B    schedule 19.04.2012