Проблема с затенением @property в target-c - PullRequest
1 голос
/ 14 февраля 2012

Почему сеттер не синтезируется для myString в приведенном ниже примере? Основное назначение, приведенное ниже, приводит к myString, равному nil.Попытка использовать установщик [self setMyString:s]; приводит к нераспознанному исключению селектора.

// in .h file
@interface MyClass
@property (nonatomic, readonly) NSString *myString;
@end

// in .m file
@interface MyClass (MyCategory)
@property (nonatomic, copy) NSString *myString;
@end

@implementation MyClass
@synthensize myString;

- (void) someMethod:(NSString *) s {
    myString = [s copy];

    // why is myString nil here?
}

@end

Редактировать : проблема была с GDB.po myString напечатано Can't print description of a NIL object..Однако NSLog(@"myString: %@", myString); напечатал ожидаемое значение.

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

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

@interface MyClass ()
@property (nonatomic, copy) NSString *myString;
@end
4 голосов
/ 14 февраля 2012

Два других ответа верны, но я думаю, что они упустили ваше намерение.Распространено объявлять свойство как доступное только для чтения в файле .h, так что код вне реализации класса не может его записать.Внутри файла .m вы хотите, чтобы он был перезаписан.Этот вид переопределения явно поддерживается .Тем не менее, вы должны поместить объявление как readwrite в расширение класса:

// In your .h file:
@interface MyClass : NSObject
    @property (nonatomic, copy, readonly) NSString *myString;
@end

// In your .m file:
@interface MyClass () // Note the empty parentheses
    @property (nonatomic, copy, readwrite) NSString *myString;
@end

Вам все равно нужно использовать self.myString = aString или [self setMyString:aString] вместо прямой записи в ivar, когда выделаю прямо сейчас.

1 голос
/ 14 февраля 2012

Объявление свойства с одинаковым именем в интерфейсе MyClass и в категории MyCategory кажется плохой идеей.Удалите объявление в категории, и я ожидаю, что все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...