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ファイルのinitメソッドで

data=[[NSMutuableArray alloc]init];

私の質問の関数を使用するには、次のようにします。

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

data後で失うよりも。

4

1 に答える 1

1

返す前に自動解除すると、他の人には無効になるので、マンチを返したくありません。だから私はこれを考えていました:

これは間違ったステートメントです。自動解放されたオブジェクトを返すことができます。これは正しいことです。返されるオブジェクトの種類をユーザーに知らせるために、メソッド名を正しく設計する必要があることに注意してください。alloc名前が、newcopy、 またはで始まるメソッドは 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 に答える