Подклассы NSMutableString - PullRequest
       4

Подклассы NSMutableString

0 голосов
/ 06 апреля 2011

Я знаю, что первое, что нужно сделать, когда у кого-то возникает вопрос с Obj-C, - это прочитать документы Apple.И я сделал.Я читаю стр.95-стр.102 Руководства по основам какао.Так что это то, что я знаю о создании составных объектов из кластеров классов.

  • Подклассы кластеров классов должны выполняться, если необходимо изменить предоставляемые функции.
  • Составные объекты должны переопределять примитивные методысуперкласса.(И я также читал, что примитивные методы суперкласса суперкласса также должны быть переопределены.)

Поэтому я применил то, что знаю.Вот мой код ...

#import <Foundation/Foundation.h>

@interface GOObjectKeyName : NSMutableString
{
    NSMutableString *embeddedNSMutableString;
}

//+ GOObjectKeyName;

//- init;

//From NSString
- (NSUInteger) length;

// From NSString
- (unichar) characterAtIndex: (NSUInteger) index;

// From NSString
- (void)getCharacters:(unichar *)buffer range:(NSRange)aRange;

// From NSMutableString
- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString;

//- (void) dealloc;

@end



#import "GOObjectKeyName.h"

@implementation GOObjectKeyName

/*
+ GOObjectKeyName
{
    return [[[self alloc] init] autorelease];
}

- init
{
    self = [super init];
    if (self)
    {
        embeddedNSMutableString = [[NSMutableString allocWithZone: [self zone]] init];
    }
    return self;
}
*/

- (NSUInteger) length
{
    return [embeddedNSMutableString length];
}

- (unichar) characterAtIndex: (NSUInteger) index
{
    return [embeddedNSMutableString characterAtIndex: index];
}

- (void)getCharacters:(unichar *)buffer range:(NSRange)aRange
{
    [embeddedNSMutableString getCharacters: buffer range: aRange];
}


- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString
{
    [embeddedNSMutableString replaceCharactersInRange: aRange withString: aString];
}

/*
- (void) dealloc
{
    [embeddedNSMutableString release];
    [super dealloc];
}
*/

@end

Комментируемые методы комментируются, потому что я не был уверен, были ли они необходимы.Я просто записал их, потому что видел их в примере.И вы также можете увидеть, что это в основном другой класс NSMutableString.Но не волнуйтесь, в этом есть большая цель, я просто хочу знать, что основы правильны, прежде чем я продолжу, так как это мой первый раз с составными объектами.И, как вы знаете ... это не работает !!Пожалуйста, поймите мое разочарование после нескольких часов проб и ошибок.Если бы кто-то мог направить меня сюда, это было бы большим облегчением.

О, и если вы не возражаете, у меня есть еще один маленький вопрос.Пример на яблочных документах описывает аналогию NSNumber.Но действительно ли NSNumber более эффективен, чем использование int, char и других фундаментальных типов?Просто любопытно.

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Конечно, было бы полезно, если бы вы охарактеризовали ошибку за пределами «она не работает».

Однако ваш метод -init закомментирован, так что embeddedMutableString не будет создан. И даже если вы раскомментируете его, вы вызываете +alloc для создания embeddedMutableString, но вы никогда не инициализируете его.

После просмотра документации кажется, что метод -init подкласса должен выглядеть следующим образом (предупреждение: непроверенный код):

-(id)init
{
    if (self = [super init]) {
        embeddedMutableString = [[NSMutableString alloc] init];
    }
    return self;
}

Вам, конечно, также придется предоставить -dealloc, который выпускает embeddedMutableString и вызывает [super dealloc].

Что касается NSNumber, то нет, он не более эффективен, чем базовые типы, такие как int, но у него есть и другие преимущества. NSNumber - это класс, поэтому вы можете хранить экземпляры NSNumber в классах коллекций Какао, таких как NSArray и NSSet. Вы можете записать их в списки свойств. NSDecimalNumber позволяет избежать неточностей, возникающих при преобразовании десятичной и двоичной системы счисления. И так далее ...

0 голосов
/ 07 апреля 2011

Чтобы ответить на ваш вопрос NSNumber, нет, NSNumber не более эффективен, чем примитивы C. NSNumber - это инкапсуляция для примитивов C, позволяющая вставлять примитивы в такие объекты, как NSArray и NSSet. Если вам нужна эта способность инкапсуляции, но вы хотите скорость int или float , достаточно просто написать свой собственный NSNumber-подобный класс, который работает только для одного типа.

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