Создайте массив целочисленного свойства в Objective C

Я испытываю затруднения при создании свойства массива целых чисел в Objective C. Я не уверен, возможно ли это даже сделать в Obj-C, таким образом, я надеюсь, что кто-то может помочь мне в обнаружении или как сделать это правильно или предоставить альтернативное решение.

myclass.h

@interface myClass : NSObject {

@private int doubleDigits[10];
}

@property int doubleDigits;
@end

myclass.m

@implementation myClass

    @synthesize doubleDigits;
    -(id) init {

        self = [super init];

        int doubleDigits[10] = {1,2,3,4,5,6,7,8,9,10};

        return self;
    }

    @end

Когда я создаю и работаю, я получаю следующую ошибку:

ошибка: тип свойства 'doubleDigits' не соответствует типу ivar 'doubleDigits'

58
задан Cœur 19 September 2019 в 11:48
поделиться

2 ответа

Это должно работать:

@interface MyClass
{
    int _doubleDigits[10]; 
}

@property(readonly) int *doubleDigits;

@end

@implementation MyClass

- (int *)doubleDigits
{
    return _doubleDigits;
}

@end
30
ответ дан robottobor 24 November 2019 в 19:03
поделиться

Я просто размышляю:

я думаю, что переменная, определенная в ivars, выделяет место прямо в объекте. Это препятствует тому, чтобы Вы создали средства доступа, потому что Вы не можете дать массив значением к функции, но только через указатель. Поэтому необходимо использовать указатель в ivars:

int *doubleDigits;

И затем выделяют место для него в init-методе:

@synthesize doubleDigits;

- (id)init {
    if (self = [super init]) {
        doubleDigits = malloc(sizeof(int) * 10);
        /*
         * This works, but is dangerous (forbidden) because bufferDoubleDigits
         * gets deleted at the end of -(id)init because it's on the stack:
         * int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
         * [self setDoubleDigits:bufferDoubleDigits];
         *
         * If you want to be on the safe side use memcpy() (needs #include <string.h>)
         * doubleDigits = malloc(sizeof(int) * 10);
         * int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
         * memcpy(doubleDigits, bufferDoubleDigits, sizeof(int) * 10);
         */
    }
    return self;
}

- (void)dealloc {
    free(doubleDigits);
    [super dealloc];
}

В этом случае интерфейс похож на это:

@interface MyClass : NSObject {
    int *doubleDigits;
}
@property int *doubleDigits;

Редактирование:

я действительно не уверен, позволяется ли сделать это, те значения действительно на стеке, или они хранятся где-то в другом месте? Они, вероятно, хранятся на стеке и поэтому не безопасные использовать в этом контексте. (См. вопрос в списках инициализатора )

int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
[self setDoubleDigits:bufferDoubleDigits];
12
ответ дан 9 revs 24 November 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: