【问题标题】:Retain-Release in Objective-CObjective-C 中的保留释放
【发布时间】:2011-06-25 23:04:49
【问题描述】:

我是 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

提前致谢。

附:如何使不带参数的 init 无效?

【问题讨论】:

    标签: objective-c release release-management retain autorelease


    【解决方案1】:

    这可能更适合http://codereview.stackexchange.com

    总之有几点:

    • 您应该阅读Designated Initializer 的概念。在您的情况下,您可能会将 initWithStr:andDelims:andDoesReturnDelims: 指定为指定的初始化程序。只有这个初始化器可以调用[super init]。所有其他初始化程序都调用 [self initWithStr:andDelims:andDoesReturnDelims:] 而不是 [super init]

    • 有一些更复杂的方法可以使init 无效,但如果你想禁用它,我只需让它返回nil。但是,在这种特殊情况下,我真的看不出您为什么要这样做。

    • init 方法和 dealloc 方法中的保留似乎没问题。方法参数在方法结束之前一直有效,如果您想保留它们超出此范围,例如在实例变量中,您需要保留它们(您似乎做得正确)。

    但是,您的示例中省略了很多代码,因此显然我只是在评论您发布的内容。

    【讨论】:

      【解决方案2】:

      参数变量不会自动保留,只能通过引用获取对象。要保留它们,您必须保留它们,就像您所做的那样。对我来说,你在那里所做的一切看起来都很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2012-01-22
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多