我正在进行一些分配
self.xyz = [[NSDictionary alloc] init];
保留像这样的财产是一个好主意吗?或
最好这样做:
NSDictionary *zzz = [[NSDictionary alloc] init];
self.xyz = zzz;
[zzz release];
我关注的是,我看到一些人保留的地方如:
self.xyz = [[NSDictionary alloc] init];
这意味着保留计数为2.那么将此处的计数减少为1的最佳方法是什么。
感谢。只是试图清除一些内存管理概念清楚一点。
答案 0 :(得分:3)
这取决于您处理财产xyz
的方式。如果你做了
@property (nonatomic, retain) NSObject *xyz;
然后xyz
在NSDictionary
上有一个保留,所以第二个(3行)版本最好。
答案 1 :(得分:2)
我通常会这样做:
self.xyz = [[[NSDictionary alloc] init] autorelease];
或者如果班级有方便的方法,那么就这样使用它:
self.xyz = [NSDictionary dictionary];
或者,在这种情况下,只需使用ARC并让它为您完成工作。
答案 2 :(得分:2)
我假设我们在谈论不使用ARC时的最佳做法。
在手动内存管理环境中,第一种方法是错误的,因为正如您所指出的,保留计数为2.执行单行的正确方法是这样的:
self.xyz = [[[NSDictionary alloc] init] autorelease];
通过合成的setter(假设使用retain指令声明xyz
),除了由alloc
/ init
添加的1之外,还为保留计数加1。自动释放是为了平衡这一点。
您详述的第二种方法在功能上是等效的,但由于可用内存相对较少,因此在嵌入式设备上被认为是更好的做法。您创建一个对象,将其分配给属性并立即释放原始临时对象。在前一种方法中,对象被放入自动释放池中,并在稍后的时间点释放。
答案 3 :(得分:1)
我认为你应该使用autorelease作为代码的最佳实践。
答案 4 :(得分:0)
你总是要平衡内存管理方程,如果没有,你可能会有内存泄漏。
在您的示例中,它取决于xyz内存管理策略。
如果xyz有保留策略,则保留计数为2。这是一个常见的错误,你有内存泄漏。
@property (retain, nonatomic) SomeClass* xyz;
如果xyz具有分配策略,则不会增加保留计数
@property (assign, nonatomic) SomeClass* xyz;
总之,如果您使用保留政策,您提供的第二个代码段是正确的方式。显然你必须记得在dealloc方法中释放该属性。
- (void)dealloc
{
[xyz release];
[super dealloc];
}
希望它有所帮助。
答案 5 :(得分:0)
第二种方法是将保留计数保持为1的最佳方法。
答案 6 :(得分:-6)
以我的拙见,
self.xyz = [NSDictionary alloc]
会导致内存泄漏。您需要手动发布。
你可以这样做
xyz = [NSDictionary alloc]
之后,即使我有同样的问题。哪种方法更好?为什么?