需要有关内存管理的建议

时间:2011-11-21 18:18:21

标签: objective-c memory-management

我已经和Objective-C一起工作了一个月,但遗憾的是我仍然是一个完整的内存管理人员,所以我需要你的建议。我将一个数组从一个文件传递给另一个文件

         BidView *bidView = [[[BidView alloc] init] autorelease];
         NSLog(@"%i",[bidView.seatsForTableCreated retainCount]);
         bidView.seatsForTableCreated = [NSArray arrayWithArray:seats];
         NSLog(@"%i",[bidView.seatsForTableCreated retainCount]);
         [self.navigationController pushViewController:bidView animated:YES];  `

NSLog告诉我,seatForTableCreated的保留计数从零增加到两个。然后,当我退出BidView屏幕(没有对seatForTableCreated数组做任何事情)时,我正在做以下事情:

NSLog(@"%i",[seatsForTableCreated retainCount]);
[seatsForTableCreated release];
NSLog(@"%i",[seatsForTableCreated retainCount]);

对我来说还不太清楚。现在NSLog告诉我(两次)保留计数是1.然后我重复这个程序(运行我的意思相同的应用程序),每次事情都是一样的:0-2-1-1。所以我的问题是:  1)为什么0到2?为什么将计数增加到2而不是1?  2)为什么它会在不受任何影响的情况下下降到1?  3)为什么它在我发布之后仍然保持1?  4)在这种情况下你如何管理记忆? 非常感谢提前

2 个答案:

答案 0 :(得分:2)

首先。不要一无所知地打电话或使用retainCount,将此属性视为私有,只有操作系统可以调用。要检查是否有内存泄漏,您应该使用Instruments。

似乎您已经创建了自动释放([NSArray arrayWithArray:seats])对象,因此无法手动释放它。

使用分配工具来检查是否有内存泄漏。

答案 1 :(得分:1)

我的建议是假设您使用的是Xcode 4+并且您没有使用ARC,

命令+ shift + B将分析您的内存管理(以及死存储等)。我认为你做对了。在您收到Analyze的投诉或发现仪器泄漏之前,请不要担心保留计数。我不确定保留计数是多么可靠。我看到有关SO的评论说不要依赖它们。

你遵守规则 New,Alloc,Copy,Retain - >完成后,您将需要释放此对象。

我也在BidView.h中假设您的属性被声明为 @property(非原子,保留)NSArray * seatsForTableCreated;

因此,在BidView.m的dealloc方法中释放它是良好的内存管理

EDIT 即使您没有为创建的表分配席位,它也可以工作。 self.seatsForTableCreated = ...将保留您在那里设置的任何对象。 因此,如果您在声明中有(保留)属性,则可以考虑

self.property = object;

作为设置属性并保留它。这些属性被添加到objective-C中以减少每个类中的类似代码。

.h

中的属性
@property (nonatomic,retain) NSObject * property; // don't name your properties property..

当您在.m

@synthesize时,编译器会自动为您创建2种方法
-(void)setProperty:(NSObject*)newP
{
    [newP retain];  // retains the new object so it sticks around for line 3
    [property release]; // releases previous property
    property = newP; // set the property to the object retained in line 1
    // property is now same as newP and you are responsible for releasing it
    // -(void) dealloc   is where you should release it
}

//注意,在创建// setProperty方法时,编译器可能无法创建与上面完全相同的代码。如果确实如此,可能会有所变化。

-(NSObject*)property
{
    return property;
}

我试图弄清楚为什么当你不发布你的财产时,Analyze没有解决问题,但却没有。这令人困惑,我想进一步探索它。