2009-05-09 4 views
7

Если вы инициализируете метод NSMutableArray с помощью метода удобства NSArray, как указано выше, вы получаете NSArray или NSMutableArray?Инициализировать NSMutableArray: [NSMutableArray array];

Любые последствия?

(я знаю, что NSMutableArray имеет «arrayWithCapacity :, я просто любопытно)

+1

Я ценю интересное обсуждение ниже для простого вопроса. Это приносит несколько тонких точек Какао. –

ответ

11

Если вы инициализировать его с помощью:.

NSMutableArray *array = [NSMutableArray array]; 

вы получите NSMutableArray Одна интересная особенность Objective-C является что методы класса наследуются подклассами

Таким образом, в методе класса вы можете сделать что-то вроде этого:.

+(id)array { 
    return [[[self alloc] init] autorelease]; 
} 

и self будут ссылаться на объект класса, в котором выполняется код (NSArray или NSMutableArray).

+0

ах, интересно. поэтому self ссылается на объект класса: NSMutableArray. В этом есть смысл. Я задавался вопросом, почему мой код не ломался! –

+1

Я думаю, что вы на самом деле сделали бы: return [[[self alloc] init] autorelease]; –

+0

Вы правы, я изменю образец кода. – pgb

4

Обновление: Хотя мой совет «проверить его сам», как правило, является хорошей идеей, в этом случае он был немного пугающим. Благодаря Джим в комментариях для того, чтобы указать на то, что мое предложение ниже не подходит для этих классов, потому что различные формы NSArray все реализованы классом мостового доступа CoreFoundation.

----- Оригинал ответа для контекста Ниже -----

Самый простой способ ответить на вопрос, как это, чтобы проверить это самостоятельно. Попробуйте выделить массив так, как вам было любопытно, а затем NSLog из вашего кода:

NSLog (@ «У нас есть% @», NSStringFromClass ([theArray class]));

+1

Несомненно, что всегда будет возвращаться 'NSCFArray'? –

+0

Отличная точка, Джим. Я забыл об этой особенности NSArray. Редактирование моего ответа выше. Благодарю. – danielpunkass

+0

Hmmm interesting. Таким образом, даже NSMutableArray вернет NSCFArray? Это затрудняет выполнение интроспекции и выясняет, есть ли у вас изменяемый объект, прежде чем пытаться его изменить. Я предполагаю, что в этом случае вы можете отвечать на запрос. На стороне заметьте спасибо за ваш потрясающий подкаст. Я вернулся и слушал большинство ваших эпизодов и Мантона. Довольно интересный и информативный. –

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