初学者记忆管理

时间:2011-11-20 02:02:16

标签: iphone objective-c cocoa-touch

如果我希望在代码中拥有良好的内存管理,我需要知道对象的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;
}

2 个答案:

答案 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].