1

自动释放会释放我的非对象 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]));
    }
}

那么自动释放是否仅适用于对象,还是会从 getCombination 中释放我的 c 数组?

编辑:由于答案是否定的,自动释放不适用于 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

autorelease是可以发送到 Objective C 对象的消息。在 ARC 之前,您需要明确地执行此操作,如下所示:

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

在 ARC 下,编译器会为您计算出autorelease部分,但消息仍会发送到对象;结果,该对象被添加到自动释放池中。当自动释放池被耗尽时,其中的所有对象都会发送一条release消息。如果没有对该对象的其他引用,则其引用计数将降至零,并且该对象将被清理。

C 数组不响应autoreleaserelease消息:它们不是 Objective C 实体,因此它们根本不响应消息。因此,您必须手动处理为这些数组分配的内存,方法是调用malloc1free.

当然,您可以将自动释放的对象放在 C 数组中,这些对象将在常规操作过程中被清除。例如

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

如果调用者在数组中没有retain NSNumber对象numbers,这些对象将被自动释放2。但是,该numbers对象需要单独清理:

free(numbers);


1你没有调用malloc你的代码,所以访问combinatopn[...]是未定义的行为。

2导致过程中引用挂起。

于 2013-01-05T13:06:48.040 回答