我已经和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)在这种情况下你如何管理记忆? 非常感谢提前
答案 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没有解决问题,但却没有。这令人困惑,我想进一步探索它。