我不想返回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]];
。
答案 0 :(得分:1)
我不想返回manch,因为如果我在退回之前自动发布,它就会变得无效。所以我在想这个:
这是一个不正确的语句,你可以返回一个自动释放的对象,这是一个明智的事情。值得注意的是,您应该正确设计方法名称以通知用户返回的对象类型。名称以alloc
,new
,copy
或mutableCopy
开头的任何方法都将返回一个保留对象。 (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。