gpt4 book ai didi

objective-c - 这是处理ivars的正确方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:26 25 4
gpt4 key购买 nike

我已经阅读了很多关于 getter 和 setter 的主题。我知道它们是什么以及为什么有用。不同的来源声称发布 ivars 的不同方式。我的困惑从这里开始

@interface CoolClass : NSObject
{
NSString *name;
}

@property (nonatomic, copy) NSString *name;
@end

@implementation CoolClass
@synthesize name = _name;

-(id)init
{
if(super = [self super])
{
self.name = @"Jo";
}
return self;
}

-(void)dealloc
{
[self.name release], self.name = nil;
}
@end

这是发布/免费 ivar 的正确方法吗?

最佳答案

大多数时候你会想要使用访问器,但不是在部分构造的状态下,因为它们可以有 negative side-effects .这是如何完成的:

- (id)init
{
if((self = [super init])) {
// self.name = @"Jo"; << don't use accessors in initializer

_name = [@"Jo" copy]; << good
}
return self;
}
// added for another variation:
- (id)initWithName:(NSString *)inName
{
if((self = [super init])) {
_name = [inName copy];
}
return self;
}

- (void)dealloc
{
// don't use accessors in dealloc
// don't release the result of a getter (release the result of the retained or copied result)
// [self.name release], self.name = nil;

// instead:
[_name release], _name = nil;
[super dealloc]; << compiler should have warned you about this one
}

注意:在 init 的情况下,字符串文字是不朽的,如果您复制它也没有关系,因为副本只会返回自身。为了清楚起见,我倾向于只“复制”不朽者,尽管这是不必要的。

关于objective-c - 这是处理ivars的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9158030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com