Если вы @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
), чтобы избежать утечки памяти