#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. возникла небольшая проблема, теперь я внедрил изменения. Не могли бы вы, пожалуйста, посмотреть выше.