0

我不想退货manch,因为如果我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;
    }

我的目标是创建一个可以NSMutuableArray 做一些计算的类,而不是返回它,并且不再依赖于这个类。

编辑 :

正如这里的人所问。在另一个类B(上述方法的用户)中,我在界面中有:

NSMutuableArray *data ;

在 .m 文件初始化方法上我有

data=[[NSMutuableArray alloc]init];

要使用我的问题中的功能,我会:

mIns=[[classA alloc]init];
data= [mIns set:[self decimalToBinary:autoWord]];

比我松的data晚。

4

1 回答 1

1

我不想退货,因为如果我在退货之前自动释放,它对其他人无效。所以我在想这个:

这是一个不正确的说法,您可以返回一个自动释放的对象,这是明智的做法。值得注意的是,您应该正确设计方法名称以告知用户返回的对象类型。任何名称以 allocnewcopy或开头的方法mutableCopy都将返回一个保留对象。(来源

在您的情况下,您的方法名称是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,更多信息)来避免这些问题,它将为您处理这种内存管理。使用正确的命名约定仍然很重要,因为 ARC 将根据此判断如何管理您的内存(在某些情况下)

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

data=[[NSMutuableArray alloc]init];

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

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

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

要修复,您需要改用它:

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

如果稍后将由其他对象填充变量,则不需要分配/初始化变量。我强烈建议重新了解这一切是如何运作的,这可能是一个好的开始

于 2012-11-07T13:27:23.463 回答