以下class
声明对我来说似乎没问题。 “name
”属性已在dealloc
中取消分配。 self.name
始终release
retain
正确。但是Xcode分析仪仍会发出泄漏警告。所以这种风格不对吗?
我是否需要使用[[init] alloc]
初始化任何autorelease
,
self.name = [[[NSString alloc] init] autorelease];
合乎逻辑吗?如果我在这里使用自动释放,那么为什么要在dealloc中释放。即便如此,我也不需要将属性声明为(保留),不是吗?
-
@interface Student : NSObject
@property (nonatomic, retain) NSString *name, *address;
@end
-
@implementation Student
-(id)initWithName:(NSString *)name
{
self = [super init];
if (self) {
self.name = [[NSString alloc] init]; // warning here ...
// self.name = @"MyName";
}
return self;
}
- (void)dealloc{
[_name release];
[super dealloc];
}
@end
最好的方法是什么?这样吗?
NSString _n = [[NSString alloc] init];
self.name = _n;
[_n release];
答案 0 :(得分:1)
看到您的[[NSString alloc] init]
将创建保留计数1
然后你通过保留的属性来分配这个对象,从而保留它使保留计数为2
现在在dealloc
你发布它,因此保留计数为1
除非你再次释放它,否则它仍在记忆中。
使用财产的正确方法是
-(id)initWithName:(NSString *)name
{
self = [super init];
if (self) {
self.name = [[[NSString alloc] init] autorelease];
self.name = @"MyName";
}
return self;
}
或
-(id)initWithName:(NSString *)name
{
self = [super init];
if (self) {
_name = [[NSString alloc] init];
self.name = @"MyName";
}
return self;
}
或
-(id)initWithName:(NSString *)name
{
self = [super init];
if (self) {
String *str = [[NSString alloc] init];
self.name = str;
[str release];
self.name = @"MyName";
}
return self;
}
答案 1 :(得分:0)
规则规定任何独立对象应在创建它的范围内[自动]释放。 Analyzer遵循此规则,并且不能绑定除init中的任何范围之外的任何其他版本。因此给出警告。
您应该自动释放已分配的对象,或使用ARC。它真的简化了一切。
答案 2 :(得分:-2)
在init方法中为property赋值的最佳方法是使用ivar。使用setter可能很危险。同时将自动释放对象分配给ivar是错误的,因为当NSAutoreleasePool耗尽时它将被释放。所以正确的方法是:
-(id)initWithName:(NSString *)name
{
self = [super init];
if (self) {
_name = [@"MyName" copy];
}
return self;
}