0

我对objective-c相当陌生,大部分都很清楚,但是在内存管理方面我有点不足。目前,我的应用程序所做的是在 NSURLConnection 期间-(void)connectionDidFinishLoading:(NSURLConnection *)connection调用该方法时输入一个方法来解析一些数据,将其放入数组中,然后返回该数组。但是我不确定这是否是最好的方法,因为我没有在自定义方法中从内存中释放数组(方法 1,请参阅附加代码)

下面是一个小脚本,可以更好地展示我在做什么

.h 文件

#import <UIKit/UIKit.h>

@interface memoryRetainTestViewController : UIViewController {

    NSArray *mainArray;

}

@property (nonatomic, retain) NSArray *mainArray;

@end

.m 文件

#import "memoryRetainTestViewController.h"

@implementation memoryRetainTestViewController
@synthesize mainArray;


// this would be the parsing method
-(NSArray*)method1
{
    // ???: by not release this, is that bad. Or does it get released with mainArray
    NSArray *newArray = [[NSArray alloc] init];
    newArray = [NSArray arrayWithObjects:@"apple",@"orange", @"grapes", "peach", nil];

    return newArray;
}


// this method is actually
// -(void)connectionDidFinishLoading:(NSURLConnection *)connection
-(void)method2
{
    mainArray = [self method1];
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    mainArray = nil;
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [mainArray release];
    [super dealloc];
}


@end
4

2 回答 2

2

是的,你的newArray被释放时mainArray被释放。但这只是method2被调用一次。

我们正在谈论参考,所以如果你有

newArray = something
mainArray = newArray
[mainArray release]

这两个变量都将仅引用 a NSArray*。那么在你的情况下newArray只是一个本地的所以没有问题。

method2如果您调用两次,则会出现问题:

newArray = something
mainArray = newArray
newArray = something2
mainArray = newArray <- old reference is lost
[mainArray release] <- just something2 is released

为了避免这个问题,你应该确保mainArray在用另一个对象覆盖引用之前释放。

编辑:没有注意到你创建了两次数组:) 不,那不好..

于 2010-06-08T00:15:14.533 回答
2

-method1首先创建一个新数组,然后用新数组覆盖它:

NSArray *newArray = [[NSArray alloc] init]; // first array, retained
newArray = [NSArray arrayWithObjects:...];  // second array, auto-released, 
                                            // pointer to first one lost

第一个数组只是在这里泄漏。您还泄漏了存储在 ivar 中的数组,只需使用合成的 setter 来避免这种情况 - 它会为您保留和释放。

如果您还没有这样做,请阅读 Cocoa 的内存管理指南

更好的版本:

- (NSArray *)method1 {
    NSArray *newArray = [NSArray arrayWithObjects:...];    
    return newArray;
}

- (void)method2 {
    self.mainArray = [self method1];
}
于 2010-06-08T00:16:26.777 回答