Objective c 需要关于内存管理的建议吗

Objective c 需要关于内存管理的建议吗,objective-c,memory-management,Objective C,Memory Management,我已经和Objective-C一起工作了大约一个月,但遗憾的是我在内存管理方面还是个十足的傻瓜,所以我需要你的建议。我将数组从一个文件传递到另一个文件,如下所示 BidView *bidView = [[[BidView alloc] init] autorelease]; NSLog(@"%i",[bidView.seatsForTableCreated retainCount]); bidView.seatsForTableCreated

我已经和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告诉我seatsForTableCreated的保留计数已从0增加到2。然后,当我退出BidView屏幕时(不使用seatsForTableCreated数组执行任何操作),我正在执行以下操作:

NSLog(@"%i",[seatsForTableCreated retainCount]);
[seatsForTableCreated release];
NSLog(@"%i",[seatsForTableCreated retainCount]);
我不太清楚。现在NSLog告诉我(两次)retaincount是1。然后我重复这个过程(我的意思是运行相同的应用程序),每次都是一样的:0-2-1-1。因此,我的问题是: 1) 为什么是0比2?为什么保留计数增加到2而不是1? 2) 为什么会降到1而不受任何影响? 3) 为什么我发布后它仍然是1? 4) 在这种情况下,您将如何管理内存?
首先非常感谢。不要无缘无故地调用或使用
retainCount
,将此属性视为私有属性,只有操作系统才能调用。要检查内存是否泄漏,应使用仪器

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


并使用分配工具真正检查内存是否泄漏。

首先。不要无缘无故地调用或使用
retainCount
,将此属性视为私有属性,只有操作系统才能调用。要检查内存是否泄漏,应使用仪器

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


并使用分配工具来真正检查是否存在内存泄漏。

我的建议假设您使用的是Xcode 4+,而不是ARC

command+shift+B将分析内存管理(以及死区存储等)。我想你是对的。在收到分析部门的投诉或发现仪器泄漏之前,不要太担心保留计数。我不确定保留计数有多可靠。我看到有人评论说不要依赖他们

你很遵守规则 新建、分配、复制、保留-->处理完此对象后,需要释放它

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

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

编辑 即使您不为创建的表分配座位,它也可以工作。
self.seatsForTableCreated=…
将保留您在那里设置的任何对象。 所以如果你有一个财产(保留)在声明中,你可以考虑

self.property = object;
设置属性并保留它。属性被添加到objective-C中,以减少每个类中存在的类似代码

h中的属性

@property (nonatomic,retain) NSObject * property; // don't name your properties property..
当您在.m中合成
@synthesis
时,编译器将自动为您创建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在你没有发布你的属性但没有发布的情况下没有发现这个问题。这令人困惑,我想进一步探讨。

我的建议是假设您使用的是Xcode 4+,而不是ARC

command+shift+B将分析内存管理(以及死区存储等)。我想你是对的。在收到分析部门的投诉或发现仪器泄漏之前,不要太担心保留计数。我不确定保留计数有多可靠。我看到有人评论说不要依赖他们

你很遵守规则 新建、分配、复制、保留-->处理完此对象后,需要释放它

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

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

编辑 即使您不为创建的表分配座位,它也可以工作。
self.seatsForTableCreated=…
将保留您在那里设置的任何对象。 所以如果你有一个财产(保留)在声明中,你可以考虑

self.property = object;
设置属性并保留它。属性被添加到objective-C中,以减少每个类中存在的类似代码

h中的属性

@property (nonatomic,retain) NSObject * property; // don't name your properties property..
当您在.m中合成
@synthesis
时,编译器将自动为您创建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在你没有发布你的属性但没有发布的情况下没有发现这个问题。这令人困惑,我想进一步探讨。

他将数组设置为属性,并且很可能保留在那里。因此,具有该属性(seatsForTableCreated)的类BidView应该释放该数组。完全正确。重新计算的概念很重要,因为您必须知道哪些操作会增加和减少它,但实际值是无用的。你应该只关心你负责的增加/减少。他将数组设置为属性,并且很可能保留在那里。因此,具有该属性(seatsForTableCreated)的类BidView应该释放该数组。完全正确。重新计算的概念很重要,因为您必须知道哪些操作会增加和减少它,但实际值是无用的。你应该只关心你负责的增加/减少。你所有的假设都是正确的:我使用的是Xcode 4,我声明我的数组为属性,就像你写的那样。我使用产品->分析,它告诉我一切都好,没有内存