Par convention, vous ne devez pas mettre d'accolades autour de @implementation. A propos de votre question : le problème que je vois avec la façon dont vous essayez d'assigner votre tableau a l'erreur suivante :
Quand vous initialisez une nouvelle instance ObjC d'un objet, ses variables d'instance sont mises à zéro, donc votre tableau sera a[0] == a[1] == a[2] == 0. C'est parce que l'allocateur demandera de la mémoire de tas de la taille de votre objet + ses ancêtres. Mais plus tard dans le code, vous essayez de copier la mémoire de la pile vers le tas : le tableau {4, 5, 6} est créé sur la pile, et le tableau[] vit sur le tas. Vous voyez le problème ici ? Ce que je ferais, si vous insistez pour le faire de cette façon, serait le suivant :
// 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;
}
Ce n'est pas la meilleure méthode, et vous devriez probablement vous en tenir à l'utilisation de malloc, mais de cette façon vous n'aurez pas à libérer le tableau plus tard. Gardez également à l'esprit qu'en procédant de cette manière, vous ne pourrez pas modifier la taille du tableau[], ce qui vous causera des problèmes à coup sûr :)