Расширение класса - неизвестный сеттер

Следующие коды разбились:

@interface AppDelegate (PrivateMethods)

@property (nonatomic, strong) NSString * name;

@end

@implementation AppDelegate

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    self.name = @"foobar";
    ...

Ошибка:

'-[AppDelegate setName:]: unrecognized selector sent to instance 0x6d73df0'

Когда я меняюсь

@interface AppDelegate (PrivateMethods)

to

@interface AppDelegate ()

Тогда все в порядке, в чем может быть причина?

Обновление: как указано ниже, поскольку я должен использовать расширение класса для этой цели, теперь возникает вопрос: допустимо ли использование расширения класса для объявления частных методов?

e.g.

@interface AppDelegate ()

- (void) start;
@property (nonatomic, strong) NSString * name;

@end

person Ryan    schedule 17.08.2012    source источник


Ответы (2)


Расширение класса в основном используется для расширения переменной общедоступного свойства. Предположим, вы предоставили объект только для чтения или метод получения любой переменной, затем вы создали тот же объект, что и для чтения в расширении. В то время как категория используется только для улучшения метода/функциональности класса.

Проверь это

@interface MyClass : NSObject
// property here is used as readonly.
@property (retain, readonly) float value;
@end

// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end

or

@interface MyClass : NSObject
// here we have exposed getter method of private instance.
- (float) value;
@end

// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, strong) float value;
@end
person Ankit Thakur    schedule 17.08.2012

Один — категория, другой — расширение класса. Если вы хотите добавить свойства к существующему классу, вам нужно использовать последний.

Вот правильный подход:

@interface AppDelegate ()

@property (nonatomic, strong) NSString * name;

@end
person J2theC    schedule 17.08.2012
comment
Спасибо, обычно я буду использовать категорию для реализации частных методов (не видимых в .h), так что теперь я могу поместить частные методы внутри расширения вместо категории? Это обычная практика? например @interface AppDelegate() — (void) запуск; \@property (неатомарное, строгое) NSString * name; \@конец - person Ryan; 17.08.2012
comment
Да, вы можете поместить методы в расширение класса. Однако я думаю, что в Xcode 4.4 вам больше не нужно объявлять свои частные методы. - person J2theC; 17.08.2012
comment
БЛАГОДАРНОСТЬ!!! 1. Так в чем же разница между использованием категории для объявления приватных методов и использованием расширения? Я вижу, что многие люди использовали категорию для этой цели в прошлом. 2. Да, в Xcode 4.4 нет необходимости, но я просто хочу избавиться от предупреждений. - person Ryan; 17.08.2012