NSString наследование - PullRequest
       1

NSString наследование

0 голосов
/ 08 января 2011

Я делаю бесполезную вещь для моего первого шага в Obj-C

@interface String : NSString
{
  int m_isnull;
}

- (id) init;
- (int) isNull;
@end


@implementation String

- (id) init
{
 self = [super init];

  m_isnull=1;
  return self;
}

- (int) isNull
{
  return m_isnull;
}

@end

тест:

String *a;

a=@"ok";

Работает отлично, но всего 2 маленьких вопроса
1) Когда я компилирую, у меня появляется это предупреждение

warning: incompatible Objective-C types assigning 'struct NSString *', expected 'struct String *'

Я не знаю, как этого избежать!?

2) a = @ "ok" - это самый быстрый способ инициализации строки, но когда я отлаживаю, я не захожу в конструктор init, почему?

Ответы [ 3 ]

3 голосов
/ 08 января 2011

Взгляните на ссылку класса NSString:

Возможно создать подкласс NSString (и NSMutableString), но для этого необходимо предоставить средства хранения для строки (которая не наследуетсяподклассы) и реализации двух примитивных методов.Абстрактные классы NSString и NSMutableString являются открытым интерфейсом кластера классов, состоящего в основном из частных, конкретных классов, которые создают и возвращают строковый объект, подходящий для данной ситуации.Создание собственного конкретного подкласса этого кластера накладывает определенные требования (обсуждается в разделе «Методы переопределения»).

Если вы действительно хотите добавить метод -isNull в NSString, вам, вероятно, лучше добавитьэто как категория.

Я думаю, вы также можете попробовать написать -(BOOL) isNotBlank.Подумайте, что произойдет, если вы вызовете -isNull для нулевого указателя, это возвращаемое значение, которое вы ожидаете?

3 голосов
/ 08 января 2011

@"ok" на самом деле строка NSS, как 1 - целое число. Вот почему вы получаете это предупреждение компилятора.

Есть также @ "" литералы NSString. Это по сути сокращение для NSString's + stringWithUTF8String метод. Mac Player уже заявил, что он используется для различать этот вид строки литерал от символа * строковый литерал в к.

Источник http://guides.macrumors.com/Objective-C_Tutorial#The_.40_symbol

Обычно вы создаете категорию в Objective-C для расширения NSString класса.

2 голосов
/ 08 января 2011

@"ok" является объектом NSString. Вы создаете экземпляр суперкласса и пытаетесь присвоить его указателю подкласса. Думайте о разделении на подклассы как об отношениях "есть". В вашем примере String - это NSString. NSString - это , а не a String. Следовательно, вы не можете назначить объект NSString указателю String.

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