Сохранить релиз в Objective-C - PullRequest
1 голос
/ 26 июня 2011

Я новичок в Objective-C, и меня смущает эта вещь с сохранением релиза.Параметры сохраняются автоматически?Нужно ли их выпускать?

Вот мой код.Правильно ли я выполнил предварительный релиз (и все остальное)?

#import "ACStringTokenizer.h"


@implementation ACStringTokenizer

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (id)initWithStr:(NSString *)theString
{
    self = [super init];
    if (self) {
        string = [theString retain];
        delimiters = @" ";
        doesReturnDelims = NO;
    }

    return self;
}

- (id)initWithStr:(NSString *)theString andDelims:(NSString *)theDelimiters
{
    self = [super init];
    if (self) {
        string = [theString retain];
        delimiters = [theDelimiters retain];
        doesReturnDelims = NO;
    }

    return self;
}

- (id)initWithStr:(NSString *)theString andDelims:(NSString *)theDelimiters andDoesReturnDelims:(BOOL)returnDelims
{
    self = [super init];
    if (self) {
        string = [theString retain];
        delimiters = [theDelimiters retain];
        doesReturnDelims = returnDelims;
    }

    return self;
}

- (int)countTokens
{
    return numberOfTokens;
}

- (BOOL)hasMoreTokens
{
    return ![queue isEmpty];
}

- (NSString *)nextToken
{
    return [queue remove];
}

- (void)dealloc
{
    [string release];
    [delimiters release];
    [queue release];

    [super dealloc];
}

@end

Заранее спасибо.

PS Как сделать init без параметров недействительными?

Ответы [ 2 ]

4 голосов
/ 26 июня 2011

Это может быть лучше подходит для http://codereview.stackexchange.com?

В любом случае, несколько баллов:

  • Вам следует ознакомиться с концепцией Назначенный инициализатор . В вашем случае вы, вероятно, сделаете initWithStr:andDelims:andDoesReturnDelims: назначенным инициализатором. Только этот инициализатор может вызывать [super init]. Все остальные инициализаторы вызывают [self initWithStr:andDelims:andDoesReturnDelims:] вместо [super init].

  • Есть несколько более сложных способов сделать init недействительным, но если вы хотите отключить его, я просто заставлю его вернуть nil. Однако я не вижу причины, по которой вы хотели бы сделать это в данном конкретном случае.

  • Сохранения в ваших методах init и методе dealloc, похоже, в порядке. Параметры метода действительны до конца метода, если вы хотите сохранить их за пределами этого, например, в переменных экземпляра их необходимо сохранить (что, по-видимому, вы сделали правильно).

Однако в вашем примере пропущено много кода, поэтому, очевидно, я комментирую только то, что вы опубликовали.

0 голосов
/ 26 июня 2011

Переменная параметра не сохраняется автоматически, вы получаете объект только по ссылке.Чтобы сохранить их, вы должны сохранить их, как и вы.Для меня это выглядит прекрасно, что ты там делал.

...