我的代码如下所示。
- (void)viewDidLoad
{
NSArray* myarr = [self createArray];
for (NSString* str in myarr)
{
NSLog(@"%@",str);
}
[myarr release];
}
-(NSArray*)createArray
{
NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil];
return arr1;
}
当我“构建和分析”时,它显示出两个泄漏。一个在[myarr release]中说,此时拥有的对象的引用计数的不正确递减。和其他在返回arr1,说,在第152行分配的对象的潜在泄漏并存储到arr1。
从上面的代码中,方法“createArray”返回一个指针,我也将释放它。我的编码方式是对还是错?
答案 0 :(得分:1)
如果您只是在viewDidLoad方法中使用该数组,那么您根本不需要在其中分配数组。您可以使用以7KV7建议的形式返回的自动释放数组。您可以在 - (void)createArray中返回一个自动释放的数组,而无需分配对象。这是一个例子。
- (void)viewDidLoad
{
NSArray* myarr = [self createArray];
for (NSString* str in myarr)
{
NSLog(@"%@",str);
}
}
-(NSArray*)createArray
{
return [NSArray arrayWithObjects:@"APPLE",@"MAC",@"IPHONE",nil];
}
如果您不必分配一个对象来使用它,那么它会使IMO更少,更清晰。
答案 1 :(得分:1)
从上面的代码中,方法“createArray”返回一个指针,我也将释放它。我的编码方式是对还是错?
取决于你如何看待它。
1)引用计数看起来不错
2)在某些情况下,静态分析器根据名称标记objc方法。因此,如果您将createArray
重命名为newArray
或名为new*
的内容,则问题可能会消失。所以它期望遵循一个约定(Apple使用的约定)。
答案 2 :(得分:0)
试试这个
- (void)viewDidLoad
{
NSArray* myarr = [[NSArray alloc] initWithArray:[self createArray]];
for (NSString* str in myarr)
{
NSLog(@"%@",str);
}
[myarr release];
}
-(NSArray*)createArray
{
NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil];
return [arr1 auotrelease];
}
您的代码存在的问题是
您没有使用myarr
或alloc
分配new
,因此您不会拥有该对象的所有权。因此发布中的问题。
您分配arr1以便获得对象的所有权并返回arr1。因此你不释放它。这就是泄漏的原因。