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
Post a Comment