2013-03-04 2 views
5

Что такое соглашение/правило/предпочтение/диктат о том, где должны быть объявлены переменные частного экземпляра и почему?Где скрывать ваши частные объекты в Objective-C

// someClass.h 

@interface someClass : NSObject { 
@private 
// Here in the class declaration? 
} 
// ... 
@end 

// someClass.m 

@interface someClass() { 
// Here in the class extension? This seems to be obj-c's version 
// of the C++ Pimpl idiom. 
} 
@end 

@implementation someClass { 
// Here in the class definition? BTW, what's the default scope here? 
// Seems like it should be @private. I haven't been able to find much 
// documentation about this declaration block. 
} 
// ... 
@end 

Можно ли прокомментировать соответствующее использование этих трех разделов или указать на это хороший веб-ресурс? Благодаря!

+6

+1 для названия. – IronMan84

+0

Название немного дерзкое, но я серьезно отношусь к вопросу. Мне не удалось найти полную документацию по этой теме. Ничего, что я видел из книг (Кочан, Садун, Али) и Apple doc, дает полное и всестороннее обсуждение этого вопроса. – Phil

+2

По умолчанию объем ivars в блоке '@ implementation' равен' @ private'. Однако это почти бесполезно, потому что, если вы не ставите несколько классов в один и тот же файл '.m', никакие другие классы не могут даже видеть * ivars, что является необходимым предварительным условием для их доступа. –

ответ

4

Сегодня рекомендуется использовать их в @implementation или в (непубличном) классе.

Ивар никогда не интересует клиентов класса, поэтому они не должны быть видимыми в публичном API (заголовок).

Разница в размещении их в @implementation или в расширении класса невелика. Для консистенции я всегда помещаю их в @implementation.

+0

для консистенции Я всегда помещал их в расширение класса. – vikingosegundo

+0

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

+0

@Tommy Я считаю, что это нарушение инкапсуляции. Другие классы (подкласс или нет) никогда не должны обращаться к иварам. –