2011-12-31 2 views
0

У меня возникла следующая проблема:Есть ли способ указать класс объектов NSMutableArray?

Я создал массив «NSMutableArray», который будет содержать объекты класса с именем «Класс». В начале этот массив должен быть пустым и должен быть заполнен во время выполнения программы.

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

Это мой первый опыт разработки Objective-C и iPhone. Я использовал код на C/C++, где я объявил свои массивы следующим образом:

Class array[NUMBEROFELEMENTS]; 

Есть ли способ сделать это в Objective-C?

Спасибо!

+1

, даже если это только для иллюстрации, вы можете выбрать другое имя, кроме класса, так как «Класс» - это существующий objc typedef. – justin

ответ

1

Истина заключается в том, что это не имеет значения для NSMutableArray какого типа объекта он находится. NSMutableArray просто хранит указатели на все объекты, которые они содержат, или ссылку.

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

MyObject *myObject = [myArray objectAtIndex:0]; 

Затем вы можете использовать объект, как вам нравится:

[myObject doThatThingWithThisValue:10]; 

Или что вам нужно.

0

Массивы в Objective-C Cocoa - это объекты (а также другие коллекции, наборы, словари). Массивы могут содержать ссылки на объекты любого типа, поэтому тип для массива простоNSArray, NSMutableArray и т.д ...

Поскольку они являются объектами, вы можете отправлять им сообщения, чтобы управлять их содержанием.

Предлагаю вам взглянуть на отличный от Apple Collections Programming Topics, в котором объясняются зачатки коллекций.

Вот краткий пример:

// two objects of different types 
NSNumber *n = [NSNumber numberWithInteger:10]; 
NSString *s = @"foo"; 

// alloc/init a new mutable array 
NSMutableArray *a = [NSMutableArray arrayWithCapacity:10]; 
// add an object 
[a addObject:n]; 
[a addObject:s]; 
// array a now contains a NSNumber and a NSString 
0

Ну, вы все равно можете иметь массивы C-стиля в Objective-C.

Однако характеристики Objective-C (некоторые люди назовут это силой, другие назовут его слабостью) - это то, что он имеет динамическую типизацию объектов и динамическую отправку.

У этого есть NSArray и NSMutableArray, которые не предназначены для определенного класса. Он может хранить объекты несовместимых классов.

Вы можете использовать следующую идиому: [obj isMemberOfClass: [Class type]], чтобы убедиться, что элемент массива имеет нужный тип, а затем отбрасывается до Class*.

Вы также можете использовать для-каждого цикла (он же быстрое перечисление):

NSMutableArray* array = //... initialize your array 
for (Class* elm in array) { 
    elm.your_property = 10; 
} 
Смежные вопросы