目标C语言 是iPhone自动释放为c数组工作



将自动释放释放我的非对象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数组/指针,我使用以下代码使用nsarray代替:

#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乘法表中的每个组合,并在所有组合都显示并显示相同次数时重新开始。

Autorelease适用于Objective-C对象。另外,您不是在创建一个C数组,而只是一个指针变量。

combination[n]的赋值正在写入未分配内存。

autorelease是一个可以发送给Objective C对象的消息。在ARC之前,您需要显式地这样做,像这样:

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

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

C数组不响应autoreleaserelease消息:它们不是Objective - C实体,所以它们根本不响应消息。因此,您必须通过调用malloc 1free .

来手动处理为这些数组分配的内存。当然,你可以在C数组中放置自动释放的对象,这些对象将在正常的操作过程中被清除。例如
NSNumber **numbers = malloc(2, sizeof(NSNumber*));
numbers[0] = [NSNumber numberWithInt:123];
numbers[1] = [NSNumber numberWithInt:456];
return numbers;

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

free(numbers);


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

2导致进程中引用挂起

相关内容

  • 没有找到相关文章

最新更新