Проблема с делегатом UITableView - PullRequest
0 голосов
/ 14 июля 2011

У меня есть пара строк, которые я синтезирую:

.h

@property(nonatomic,copy) NSString* bio;

.m

@synthesize       bio;

//connectionDidFinish method
bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];

Когда первая таблица загружается, я получаюошибка -[NSNull length]: unrecognized selector sent to instance 0x11d45e8 в cellForRowAtIndexPath:

case kBioSectionDescriptionRow:                 
                    if ([bio length]==0 ||bio == nil) {
                        cell.textLabel.text = @"bio";   
                        cell.selectionStyle = UITableViewCellSelectionStyleNone;
                        cell.detailTextLabel.numberOfLines = 5;
                        cell.detailTextLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:(14.0)];
                        cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
                        cell.detailTextLabel.text = @"None"; 
                    }
                    else{
                        cell.textLabel.text = @"bio";   
                        cell.selectionStyle = UITableViewCellSelectionStyleNone;
                        cell.detailTextLabel.numberOfLines = 5;
                        cell.detailTextLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:(14.0)];
                        cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
                        cell.detailTextLabel.text = [NSString stringWithFormat: @"%@", bio]; 
                    }

                    break;

Как я могу убедиться, что моя биография выделена, а не ноль?

Ответы [ 2 ]

3 голосов
/ 14 июля 2011

Если вы @synthesize ваше bio свойство, почему вы используете переменную вместо свойства?

Вместо того, чтобы напрямую воздействовать на переменную bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];, вам нужно вместо этого воздействовать на само свойство:self.bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];.


Если быть более точным, запись self.bio = xx означает, что он вызывает метод setter свойства bio.Этот установщик будет управлять памятью для вас, то есть он освободит предыдущее значение свойства bio и скопирует новое значение.

Если вы вместо этого напишите bio = xx, что напрямую повлияет на переменную экземпляра, а не на свойство, выпуск или копирование не выполняются, поэтому объект, который вы затрагиваете для био-переменной , не сохраняется и не копируется и будет уничтожен в конце текущего цикла RunLoop.

Вот почему ваш код вылетает , потому что вы затем пытаетесь получить доступ к переменной bio, которая больше ни на что не указывает (на самом деле это указывает на мусор, в вашем случае sthg ошибочно считает, что [NSNull null] объект), поскольку реальный объект был уничтожен с тех пор!


На самом деле, @synthesize bio просто просит компилятор сгенерировать код для установщика и получателя свойства, а также как ваше свойствоопределяется атрибутами nonatomic,copy, сгенерированный установщик будет выглядеть следующим образом:

-(void)setBio:(NSString*)value {
  if (value == bio) return; // if already the exact same object (same pointer), return

  [self willChangeValueForKey:@"bio"]; // For KVO
  [bio release]; // release previous value
  bio = [value copy]; // copy new value
  [self didChangeValueForKey:@"bio"]; // For KVO
}

Примечание: не забудьте выпустить био вариациюИспользуйте метод dealloc (или установите для свойства self.bio значение nil), чтобы избежать утечки памяти

0 голосов
/ 14 июля 2011

Ваше назначение для bio в -connectionDidFinish должно быть назначением для self.bio.

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