objective c - Error: "Unrecognized selector" when using addObjects: on an NSMutableArray -


when executing

[self.blockviews addobject:curblockview]; 

i error

2011-07-01 13:35:26.240 block breaker[42061:207] -[__nsarrayi addobject:]: unrecognized selector sent instance 0x4e037a0

i pretty new objective-c. in init method?

// //  gameengine.h //  block breaker // //  created chris muench on 7/1/11. //  copyright 2011 n/a. rights reserved. //  #import <foundation/foundation.h>   @interface gameengine : nsobject {     nsmutablearray *blockviews;     int numblockrows;     int score; } @property (nonatomic, copy) nsmutablearray *blockviews; @property int numblockrows; @property int score;  - (void) setup; - (void) setupblocks; @end   // //  gameengine.m //  block breaker // //  created chris muench on 7/1/11. //  copyright 2011 n/a. rights reserved. //  #import "gameengine.h" #import "block.h" #import "blockview.h"   @implementation gameengine @synthesize blockviews; @synthesize numblockrows; @synthesize score;  - (id) init {     if ((self = [super init]))      {         self.blockviews = [[nsmutablearray alloc] init];         self.numblockrows = 2;         self.score = 0;     }     return self; }  - (void) setup {     [self setupblocks]; }  - (void) setupblocks {     float blockwidth = 10;     float blockheight = 10;     float rowspacing = 2;     float colspacing = 2;     float currentx = 0;     float currenty=10;     float screenwidth = 200;      (int rowcounter=0;rowcounter<self.numblockrows;rowcounter++)     {          while(currentx <=screenwidth)         {             block *curblock = [[block alloc] initwithwidth:blockwidth height:blockheight];             blockview *curblockview = [[blockview alloc] initwithframe:cgrectmake(currentx, currenty, curblock.width, curblock.height)];             curblockview.block = curblock;              [self.blockviews addobject:curblockview];                        currentx+=blockwidth+colspacing;             [curblock release];             [curblockview release];         }          currentx=0;         currenty+=blockheight+rowspacing;     }   }  @end 

when copy nsmutablearray using copy method, or synthesized setter property specified copy, immutable copy, means end plain nsarray.* there method mutablecopy preserve mutability, don't believe there's way specify property.

if want array mutably copied when set it, you'll have write own setter method, , specify method in property declaration.

@property (nonatomic, copy, setter=setblockviewsbycopying) nsmutablearray * blockviews; 

- (void) setblockviewsbycopying: (nsmutablearray *)newblockviews {     nsmutablearray * tmp = [newblockviews mutablecopy];     [blockviews release];     blockviews = tmp; } 

a side note, @insertwittyname mentioned in comment, code initializing blockviews create leak, because have 2 claims of ownership on array you're creating -- 1 alloc , 1 retain or copy using property:

self.blockviews = [[nsmutablearray alloc] init]; //  ^ 1 claim                    ^ 2 claims // 1 release later, when property set again! // leak! 

you should instead do:

self.blockviews = [nsmutablearray array]; // creates object don't own make 1 claim // on using setter 

*though class cluster, unspecified concrete subclass.


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -