Доступен список массивов iPhone Xcode

#iphone #objective-c #arrays #xcode

#iPhone #objective-c #массивы #xcode

Вопрос:

В настоящее время разрабатываю свое первое собственное приложение для iPhone, приложение будет интегрироваться в существующее .net-приложение и будет использовать веб-сервисы. Однако проблема, с которой я сталкиваюсь, я считаю, это не что иное, как мое понимание xcode.

Я надеюсь, что смогу это объяснить…

Хорошо, в моем первом представлении, в viewDidLoad я перехожу к веб-сервису и возвращаю свой список элементов (они заполняют tableview), это работает абсолютно нормально:

— фрагмент —

 - (void)viewDidLoad {
//GET ALL ITEMS
    myArray = [[NSMutableArray alloc] init];    
    MyWebService *webService = [[MyWebService alloc] init]; 
    myArray = [webService getAllNewsFunction];
    [super viewDidLoad];

}
  

— фрагмент —

Итак, теперь мой tableview заполнен и ожидает, когда вы выберете свой элемент (в данном случае новостную статью), мне нужно определить SelectedItem, чтобы заполнить следующий вид подробными сведениями о статье. Однако, похоже, что в методе didSelectRowAtIndexPath мой список массивов больше недоступен. На данный момент я очень смущен из-за того, что я просто создаю список элементов в моем viewDidLoad в текущем представлении, например, без использования моего веб-сервиса:

— фрагмент —

 //  listOfItems = [[NSMutableArray alloc] init];
// [myArray addObject:@"Iceland"];
//  [listOfItems addObject:@"Greenland"];
//  [listOfItems addObject:@"Switzerland"];
//  [listOfItems addObject:@"Norway"];
//  [listOfItems addObject:@"New Zealand"];
//  [listOfItems addObject:@"Greece"];
//  [listOfItems addObject:@"Italy"];
//  [listOfItems addObject:@"Ireland"];
  

— фрагмент —

вышеуказанное доступно в didSelectRowAtIndexPath, и я могу заполнить detailview.

Не могли бы вы, пожалуйста, помочь мне точно определить проблему, с которой я сталкиваюсь, и как это можно решить. Я понимаю, что дал вам самые основы, поэтому, если мне нужно предоставить больше информации, я с радостью это сделаю.

— обновить —

хорошо, основываясь на вашем ответе, я обновил следующее.

Теперь я объявил myArray как свойство

 @property (nonatomic, retain) NSMutableArray  *myArray;
  

а также обновил строку до:

 self.myArray = [webService getAllNewsFunction];
  

— обновить —

однако теперь я получаю сообщение об ошибке «программа получила сигнал: «SIGABRT»» на self.Строка моего массива.

есть идеи?

Еще раз спасибо

Ответ №1:

Если вы соблюдаете соглашения об именовании, то метод [webService getAllNewsFunction] вернет автоматически выпущенный массив. Поэтому, когда вы снова получите к нему доступ, он, скорее всего, уже будет выпущен.

Если вы использовали @property для объявления myArray (что необходимо, чтобы избавить себя от этих проблем), вы можете решить это, выполнив:

 self.myArray = [webService getAllNewsFunction];
  

Эта строка:

 myArray = [[NSMutableArray alloc] init];
  

также переполнен и вызывает утечку памяти, поскольку вы переназначаете значение myArray на [webService getAllNewsFunction] сразу после, не выпуская новый NSMutableArray выделенный / инициализированный вами

Обновить

Итак, прочитав ваше обновление, я думаю, вам нужно сначала взглянуть на предупреждения, которые теперь есть в вашем проекте, которые, вероятно, будут выглядеть примерно так:

Для свойства ‘myArray’ требуется определить метод ‘setMyArray’ — используйте @synthesize, @dynamic или предоставьте реализацию метода в …

Следующий ключ к проблеме появляется в консоли, я получаю что-то вроде этого

-[TestAppDelegate setMyArray:]: нераспознанный селектор, отправленный экземпляру…

Итак, все это сводится к тому, что вам либо нужно предоставить методы

 - (NSMutableArray *)myArray;
- (void)setMyArray:(NSMutableArray *)myArray;
  

или позвольте компилятору сделать это за вас, добавив @synthesize инструкцию, подобную этой

 .m
@implementation YourClass

@synthesize myArray;

// The rest of your class methods

- (void)dealloc
{
    // release other ivars
    [myArray release];
    [super dealloc];
}
  

Синтезировать — это более простые и быстрые параметры, и компилятор организует совместное управление памятью в зависимости от того, какие параметры вы используете в своем @property объявлении.

Комментарии:

1. возникла небольшая проблема, теперь я внедрил изменения. Не могли бы вы, пожалуйста, посмотреть выше.