@property NSArray в didSelectRowAtIndexPath - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть TableviewController с:

@property (nonatomic,weak) NSSArray *myArray;

Затем я помещаю некоторые объекты в мой массив в viewdidload

Когда я нажимаю на строку, я хочу получить доступ к своему массиву в:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Но я не могу, xcode каждый раз возвращает NULL ...

Какое решение?

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Хмм ... Звучит так, будто ваша программа использует автоматический подсчет ссылок (ARC) , где ваши свойства и переменные могут быть слабыми или сильными ссылками, а сохранения и выпуски генерируются для вас автоматически.

Из этого документа:

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
@property(strong) MyClass *myObject;

// The following declaration is similar to "@property(assign) MyClass *myObject;"
// except that if the MyClass instance is deallocated,
// the property value is set to nil instead of remaining as a dangling pointer.
@property(weak) MyClass *myObject;

ARC не генерирует никаких сохранений для вашей переменной myArray, поэтому, когда у вас нет сильных ссылок на нее, ее память освобождается и любые ссылки на нее обнуляются, что приводит к поведению, которое вы видите. Попробуйте изменить вашу собственность со слабой на сильную ссылку. Слабые ссылки могут быть полезны для предотвращения циклов ссылок и аналогичных ситуаций, но в обычном случае, когда один объект «владеет» другим и хочет, чтобы он оставался живым, пока владеющий объект жив (например, данные в NSArray, используемые вашим TableViewController) вам нужна надежная ссылка, точно так же, как вы хотели бы сохранить объект, если используете код не-ARC.

0 голосов
/ 07 мая 2012

У меня была та же проблема, что вам нужно сделать:

@interface YourTableView:UITableViewController
 {
         NSArray *_myArray;
 }

@property(non atomic,strong) NSArray *myArray;

Сейчас в реализации;

@synthisize myArray=_myArray;

Я надеюсь, что это поможет вам

0 голосов
/ 01 марта 2012

Да, это может быть связано с тем, что вы объявили свойство myArray как слабое, что означает, что установщик не отправит ему сообщение retain. Тем не менее, у меня есть также вероятность того, что вы не устанавливаете его вообще - это происходит со мной, потому что, если вы установили myArray, а базовый NSArray действительно был выпущен, то более вероятно, что myArray будет какой-то висящей, недействительной ссылкой, а не nil.

Где вы установите myArray? Пожалуйста, отправьте код!

...