Как правило, вы не должны ставить фигурные скобки вокруг @implementation.
По поводу вашего вопроса: проблема, которую я вижу в том, как вы пытаетесь назначить вам массив, имеет следующую ошибку:
Когда вы инициализируете новый экземпляр ObjC объекта, его переменные экземпляра устанавливаются в ноль, поэтому ваш массив будет иметь вид [0] == a [1] == a [2] == 0. Это потому, что распределитель спросит у кучи памяти размер вашего объекта + его предков. Но позже в коде вы пытаетесь скопировать память из стека в кучу: массив {4, 5, 6} создается в стеке, а массив [] живет в куче. Вы видите проблему здесь? Что бы я сделал, если бы вы настаивали на этом, было бы следующее:
// compile from command line with
// gcc -framework Foundation -g -Wall -o test test.m
//
#import <Foundation/Foundation.h>
@interface Bla : NSObject
{
int array[3];
}
- (void)checkArray;
@end
@implementation Bla
- (id)init
{
self = [super init];
if (self) {
// init here
int tmpArray[3] = { 4, 5, 6};
memcpy(array, tmpArray, 3 * sizeof(int));
}
return self;
}
- (void)checkArray
{
NSAssert(array[0] == 4, @"invalid array initialization (4)");
NSAssert(array[1] == 5, @"invalid array initialization (5)");
NSAssert(array[2] == 6, @"invalid array initialization (6)");
}
@end
int main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
{
Bla *bla = [[Bla alloc] init];
[bla checkArray];
NSLog(@"done");
[bla release];
}
[pool release];
return 0;
}
Это не лучший способ, и, вероятно, вы захотите использовать malloc, но таким образом вам не придется освобождать массив позже. Также имейте в виду, что если вы сделаете это таким образом, вы не сможете изменить размер массива [], это наверняка приведет к проблемам:)