我读过很多关于getter和setter的主题。我知道它们是什么,为什么有用。不同的消息来源有不同的释放依瓦尔的方式。我的困惑开始了
@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这是释放/释放依瓦尔的正确方式吗?
发布于 2012-02-06 17:43:03
您将希望在大多数情况下使用访问器,但不要在部分构造的状态下使用,因为它们可以具有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__的情况下,字符串文字是不朽的,如果复制它也没有关系,因为副本只会返回自身。我的偏好是为了清晰起见只是“复制”不朽的东西,尽管这是不必要的。
发布于 2012-02-06 17:54:31
以下是我的建议:
@interface CoolClass : NSObject
@property (nonatomic, copy) NSString *name;
@end
@implementation CoolClass
@synthesize name = _name;
-(id)init
{
if(super = [self super])
{
self.name = @"Jo";
}
return self;
}
-(void)dealloc
{
[_name release];
[super dealloc];
}
@end备注:
=
发布于 2012-02-06 18:05:44
@interface CoolClass : NSObject
{
NSString *name;
}你在这里声明了一个实例变量'name';现在不需要在头文件中声明ivars。只需使用属性并使编译器为您合成ivar。
@property (nonatomic, copy) NSString *name;在这里,我们有一个属性声明,它指定应该使用对象的副本进行赋值,并向先前的值发送释放消息。
在实现中,你想要合成你的属性:
@synthesize name = _name;这段代码告诉编译器为名为'name‘的属性生成一个getter和setter,并使用名为'_name’的实例变量来存储值。所以你现在有两个ivars 'name‘和'_name’。
init方法应该是这样:
-(id)init
{
if(self = [super init])
{
name = @"This is ivar declared between {}";
_name = @"synthesized ivar";
}
return self;
}和dealloc:
-(void)dealloc
{
[name release];
[_name release];
[super dealloc];
}https://stackoverflow.com/questions/9158030
复制相似问题