如果我希望在代码中拥有良好的内存管理,我需要知道对象的retaincount
是否应始终为0
。我从一本书中得到了以下代码。并且有一个名为NSLog
的声明after release = 2
,那么我是否应该再发布2次以使retaincount
为0?
#import <Foundation/NSObject.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSValue.h>
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSNumber *myInt = [NSNumber numberWithInteger: 100];
NSNumber *myInt2;
NSMutableArray *myArr = [NSMutableArray array];
NSLog (@”myInt retain count = %lx”,
(unsigned long) [myInt retainCount]);
[myArr addObject: myInt];
NSLog (@”after adding to array = %lx”,
(unsigned long) [myInt retainCount]);
myInt2 = myInt;
NSLog (@”after asssignment to myInt2 = %lx”,
(unsigned long) [myInt retainCount]);
[myInt retain];
NSLog (@”myInt after retain = %lx”,
(unsigned long) [myInt retainCount]);
NSLog (@”myInt2 after retain = %lx”,
(unsigned long) [myInt2 retainCount]);
[myInt release];
NSLog (@”after release = %lx”,
(unsigned long) [myInt retainCount]);
[myArr removeObjectAtIndex: 0];
NSLog (@”after removal from array = %lx”,
(unsigned long) [myInt retainCount]);
[pool drain];
return 0;
}
节目输出
myInt保留计数= 1
添加到array = 2后 在分配给myInt2 = 2后 保留= 3后的myInt 保留= 3后的myInt2 释放后= 2
从array = 1中删除后
更新
The following code was taken from the Apples memory management document。他们保留了一个NSNumber对象并且它从未被释放过,这样可以吗?
- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[_count release];
// Make the new assignment.
_count = newCount;
}
答案 0 :(得分:5)
您不应该担心对象的保留计数,特别是因为NSArray或其他对象可能会保留,然后才会释放您传递给它们的内容。我强烈建议关注Objective-C和Cocoa's memory management rules,以确保在需要时清理内容。
答案 1 :(得分:1)
这不是要取消现有的答案,而是要解决你的编辑问题(顺便说一下,这应该是一个单独的问题。):
他们保留了一个NSNumber对象并且它从未被释放过,这样可以吗?
- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[_count release];
// Make the new assignment.
_count = newCount;
}
如果这就是他们所做的那样,那就不会了。
你正在混淆指针与对象。您是否在newCount之前看到了(NSNumber *)
。 '*
'表示newCount是指向NSNumber对象的指针。请允许我翻译。
[newCount retain];
保留指针'newCount'引用的对象。
[_count release];
向当前由'_count'指针引用的对象发送一条释放消息。
_count = newCount;
使指针'_count'引用指针'newCount'引用的对象
可以这样想,如果你有车,你可以称之为myCar
。当你说myCar
你的意思是你的车,你拥有的车。假设您购买新车一段时间,您可以将其称为newCar
,以便您可以区分它们。所以你取得了新车的所有权[newCar retain]
,并且短暂地拥有了两辆车。现在你卖掉你的旧车,你仍然称之为myCar
,[myCar release]
(非常难过)。但现在当你说myCar时,你的意思是你的newCar myCar = newCar
。你不再拥有你的旧车。现在你的newCar只是myCar而你拥有,保留,那个。当你死后,dealloc
,你的车将被出售,[myCar release].