返回一个nsmutuableArray作为mutuablecopy的指针

时间:2012-11-07 12:55:09

标签: objective-c

我不想返回manch,因为如果我{i}返回之前,它会变得无效。所以我在想这个:

autorelease

我的目标是创建一个类,让 classA -(NSMutableArray*)set:(NSMutableArray*)data { manch= [[data mutableCopy]autorelease] ; int count=2*[data count]; //to not enter infinity loop for(int k=0;k< count;k=k+2) { if(k==count-1) [manch addObject:[NSNumber numberWithInt:![[manch objectAtIndex:k] integerValue] ] ]; } data=[manch mutuableCopy]; return data; } 做一些计算,而不是返回它,并且不再相信了。

编辑:

正如这里的人们所问的那样。 在另一个classB(上面方法的用户)中,我在界面中:

NSMutuableArray

和.m文件的init方法我有

NSMutuableArray *data ;

使用我的问题中的函数,我这样做:

data=[[NSMutuableArray alloc]init];

比我后来松开mIns=[[classA alloc]init]; data= [mIns set:[self decimalToBinary:autoWord]];

1 个答案:

答案 0 :(得分:1)

  

我不想返回manch,因为如果我在退回之前自动发布,它就会变得无效。所以我在想这个:

这是一个不正确的语句,你可以返回一个自动释放的对象,这是一个明智的事情。值得注意的是,您应该正确设计方法名称以通知用户返回的对象类型。名称以allocnewcopymutableCopy开头的任何方法都将返回一个保留对象。 (Source

在您的情况下,您的方法名称为set:,它会通知用户此方法它将返回一个非保留对象(几乎总是autoreleased个对象)。这是因为它没有上述任何一个词的前缀。

在这种情况下,您遇到的问题是方法的用户;他们没有保留对返回对象的引用。因此,该方法的用户应该如此使用它:

@interface ClassName () {
    NSMutableArray* m_ivarArray;
}
@property (nonatomic, retain) NSMutableArray* propertyArray;
@end

NSMutableArray* data = ...;

// If using a property with retain, setting via "self." will retain it for you
self.propertyArray = [self set:data];

// If using an ivar (which doesn't do the retain for you)
m_ivarArray = [[self set:data] retain];

您可以使用自动引用计数(ARC,More Information)来避免这些问题,它将为您处理此类内存管理。 使用正确的命名约定仍然很重要,因为ARC将根据此判断如何管理您的记忆(在某些情况下)

更新:看到您的更新后,我可以看到问题。

data=[[NSMutuableArray alloc]init];

这是创建NSMutableArray的新实例,其中一个正确保留(由于我之前提到过)。

data= [mIns set:[self decimalToBinary:autoWord]];

这是用新的NSMutableArray替换data中保存的对象,这是一个自动释放的对象。您创建的上一个实例已丢失,您已将其替换为另一个实例。 这个新实例未被保留,因此会意外释放。

要修复,您需要使用此代码:

NSMutableArray* data = [[mIns set:[self decimalToBinary:autoWord]] retain];

如果稍后某个其他对象将填充变量,则不需要分配/初始化变量。我强烈建议了解这一切是如何运作的,this might be a good start