1

autorelease はオブジェクト以外の C 配列を解放しますか? おそらくオブジェクトだけが参照カウントを知っているのではないでしょうか? ここに私のコードがあります:

-(int *)getCombination{
    int xIndex = arc4random() % [self._num1 count] + 1;
    int yIndex = arc4random() % [self._num2 count] + 1;
    int *combination;
    combination[0] = [[self._num1 objectAtIndex:xIndex]intValue];
    combination[1] = [[self._num2 objectAtIndex:yIndex]intValue];
    return combination;
}

これは私の main() 関数です:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([YYAAppDelegate class]));
    }
}

自動解放はオブジェクトに対してのみ機能しますか、それとも私の c 配列を getCombination から解放しますか?

編集:答えはノーなので、自動解放は c 配列/ポインターでは機能しません。代わりに NSArrays を使用する次のコードを使用しました。

#import <Foundation/Foundation.h>

@interface Multiplication : NSObject

@property (strong, nonatomic) NSMutableArray *_combinations;

-(id)initArrays;
-(NSArray *)getCombination;

@end

#import "Multiplication.h"

@implementation Multiplication
@synthesize _combinations;

-(void)initializeArray{
    self._combinations = [[NSMutableArray alloc]init];
    for (int i = 1; i <= 10; i++) {
        for (int j = 1; j <= 10; j++) {
            NSNumber *x = [NSNumber numberWithInt:i];
            NSNumber *y = [NSNumber numberWithInt:j];
            [self._combinations addObject:[NSArray arrayWithObjects:x, y, [NSNumber numberWithInt:([x intValue] * [y intValue])], nil]];
        }
    }
}

-(NSArray *)getCombination{
    if ([self._combinations count] == 0) {
        [self initializeArray];
    }

    int index = arc4random() % [self._combinations count];
    NSArray *arr = [self._combinations objectAtIndex:index];
    [self._combinations removeObjectAtIndex:index];
    return arr;
}

-(id)initArrays{
    self = [super init];
    if (self) {
        [self initializeArray];
    }
    return self;
}

@end

ところで、この関数は、10X10 の掛け算表のすべての組み合わせをランダムに表示する方法を提供し、すべての組み合わせが表示され、同じ回数になったときに再開する方法を提供することになっています。

4

2 に答える 2

2

Autorelease は、Objective-C オブジェクト用です。また、C 配列を作成するのではなく、ポインター変数だけを作成します。への割り当ては、割り当てられcombination[n]ていないメモリに書き込んでいます。

于 2013-01-05T12:54:10.920 に答える
1

autoreleaseObjective C オブジェクトに送信できるメッセージです。ARC の前は、次のように明示的に行う必要がありました。

MyObject *obj = [[[MyObject alloc] init] autorelease];

ARC では、コンパイラがそのautorelease部分を判断しますが、メッセージはオブジェクトに送信されます。その結果、そのオブジェクトは自動解放プールに追加されます。自動解放プールが空になると、その中のすべてのオブジェクトにreleaseメッセージが送信されます。オブジェクトへの他の参照がない場合、その参照カウントはゼロになり、オブジェクトはクリーンアップされます。

C 配列は応答autoreleasereleaseメッセージも行いません。これらは Objective C エンティティではないため、メッセージにはまったく応答しません。したがって、これらの配列に割り当てるメモリは、malloc1とを呼び出して手動で処理する必要がありfreeます。

もちろん、自動解放されたオブジェクトを C 配列内に配置することもできます。これらのオブジェクトは、通常のアクションでクリーンアップされます。例えば

NSNumber **numbers = malloc(2, sizeof(NSNumber*));
numbers[0] = [NSNumber numberWithInt:123];
numbers[1] = [NSNumber numberWithInt:456];
return numbers;

呼び出し元が配列retain NSNumber内でオブジェクトを作成しない場合、これらのオブジェクトは自動解放されます2。ただし、オブジェクトは個別にクリーンアップする必要があります。numbersnumbers

free(numbers);


1コードで呼び出していないmallocため、アクセスcombinatopn[...]は未定義の動作です。

2処理中に参照がぶら下がっている。

于 2013-01-05T13:06:48.040 に答える