2012-06-01 2 views
1

Я уверен, что это полный Noob вопрос ... но я никогда на самом деле никогда не приходилось иметь дело с этим сценарием, прежде чем это я немного озадаченный ...Доступ к NSMutableArray внутри моего пользовательского объекта

Предположим, у меня есть пользовательский объект, на который я позвоню человеку, и каждый человек может иметь массив «владений», своего рода инвентарь, если хотите. Я бы поставил его так:

interface person : NSObject { 
    NSString *name; 
    NSMutableArray *posessions; 

@property (copy) NSString *name; 
@property (copy) NSMutableArray *posessions; // no idea if this is even necessary... 

} 

Конечно, я хотел бы также синтезировать свои свойства в файле реализации ... Сейчас, на мой реальный объект контроллера, я хотел бы сделать экземпляр моего объекта (или, как правило, массив экземпляров, но для этого примера, одна будет работать нормально ...), а так:

person *aPerson; 

Я знаю, что для доступа имена людей, я мог бы сделать вызов, как это:

[aPerson setName:@"Bob"]; 

и r etrieve это имя, я мог бы использовать это:

aVar = [aPerson name]; 

То, что я застрял на том, как именно будет идти о добавлении или извлечения объектов к NSMutableArray, расположенные внутри моего лица класса? Предположим, я хочу использовать метод count для NSMutable Array.

Я сделал некоторые проб и ошибок с попытками таких как:

[aPerson.posessions count]; 
[[aPerson posessions] count]; 

Аналогично, чтобы добавить объект в массив, я часто использовал:

[someArray addObject:anObject]; 

, но попытки, как это не работали:

[aPerson.posessions addObject:anObject]; 

После того, как вы прочитали кучу и искали в Интернете, я не могу найти точно, как мне nteract с этим NSMutableArray в моем пользовательском классе. Я уверен, что это что-то очевидное, что я просто не совсем понял, и это стало своего рода ментальным блоком ...

Кроме того, могу ли я правильно синтезировать свойства доступа для NSMutableArray? Если это так, setX и X не кажутся настолько очевидными с NSMutableArray ... если они просто не копируют весь массив в локальную переменную ...

Возможно, это то, что нужно сделать? использовать методы доступа, чтобы получить весь массив, поместить его в локальную переменную, внести изменения, а затем использовать метод set accessor, чтобы вернуть весь массив в мой объект person?

Может кто-нибудь просветить меня немного по синтаксису, который я должен использовать здесь?

* EDIT *

Я думал, что я хотел бы добавить немного разъяснений на этот вопрос. Мои пользовательские объекты (в приведенном выше примере, мой персональный объект) - это в основном записи базы данных. У меня есть несколько баз данных, с которыми я работаю в моем проекте, например, например:

Person - пользовательский подкласс NSObject, содержащий несколько объектов NSString, а также Ints и BOOL.

personDatabase - массив объектов Person (созданных и контролируемых в пределах моего основного объекта CONTROLLER)

Все множества и получить методы вызываются из «Controller».

То, что я пытался сделать, - это напрямую получить доступ к отдельным объектам, содержащимся в файле personDatabase, из моего объекта Controller. Я сделал это, объявив другой объект таким образом:

Person *activePerson; 

Тогда все мои звонки сделаны в настоящее время активной записи лицо (один в данный момент выбран из personDatabase), такие как:

someOutput = [activePerson name]; 

и т. Д.

Есть ли способ прямого доступа к объектам внутри объекта NSMutableArray внутри объекта activePerson из моего объекта Controller?

+0

Когда вы говорите: «Попытки, подобные этому, не сработали», вы имеете в виду, что он не добавил его в массив или не получил ошибку? –

+0

массив всегда возвращает число 0 независимо от того, каким образом я пытался манипулировать им, поэтому он либо не добавляет объект вообще, либо делает что-то совершенно неожиданное (для меня). Я в основном пытаюсь понять правильный синтаксис, используемый для добавления объекта или чтения объекта из массива. –

ответ

2

Вы указали свойство «владения» как «копия». Поэтому, когда вы пишете aPerson.possessions, вы получаете копию массива предметов. Вызов addObject добавляет anObject к новому массиву, который является копией массива aPerson's. Простейшим «исправлением» было бы изменить «копию» на «сохранить» (и, вероятно, «только на чтение»). [Изменить: Неверно; это «копировать при назначении» - не «копировать при чтении»]

Однако возникают большие проблемы. У человека есть имущество, но как вы храните их, это деталь реализации. Когда вы помещаете NSMutableArray в открытый интерфейс, вы чрезмерно ограничиваете свою реализацию. Вы могли бы лучше изменить интерфейс Person вдоль линий:

@interface Person : NSObject { 
@private 
    NSString *name; 
    // ... 
    } 
    - (Boolean) addPossession: (NSObject *) obj; 
    - (Boolean) remPossession: (NSObject *) obj; 
    - (Boolean) hasPossession: (NSObject *) obj; 
    - (NSArray *) allPossessions; 
@end 

Тогда, как вы реализуете эти методы владения зависит от того, если вы используете массив, набор, связанный список, дерево, без разницы.

+0

Я ожидал бы тогда, что «копия» массива должна вернуть число 1, затем ... в приведенном выше примере метод count возвращает 0, который, я думаю, означает, что в массив не добавляется объект. В этом конкретном случае это не так, что это не добавление к правильному экземпляру массива, это больше, чем добавление объекта к любому экземпляру массива. Я думаю, что это мой синтаксис, это проблема. –

+0

Ах. Не думал об этом так. Конечно, чистый «объектно-ориентированный» подход. Я уверен, что это решит мою проблему. Это буквально единственный массив, содержащийся в любом из моих пользовательских классов для этого проекта. Каждый другой iVar является не-массивом, поэтому я смог использовать методы доступа для всех до этого момента. –

+0

* Каждый раз, когда вы вызываете aPerson.possessions, вы получаете еще одну новую копию (в которой будет 0 объектов). [aPerson.possessions addObject: obj]; NSAssert (0 == [aPerson.possessions count]); – GoZoner

Смежные вопросы