ios - Properties and ARC -


i working arc , cocos2d 2.0 static library (which not use arc , compiled separate target). translated old project (made without arc) , wondering whether declaring properties in way has potential retain cycle issue:

@interface playerdata : nsobject <nscoding> { }   //is ok save if game gets paused may want save this. @property (readwrite, nonatomic) int numberofhits; @property (readwrite, nonatomic) bool everbeenhitincurrentlevel; @property (readwrite, nonatomic) int hitsforonehearth; 

i noticed various scenes build memory on time. added cclog call in release method of cclayer method (myscene : cclayer) , never gets called. that's how create scene (which replace using "[ccdirector shareddirector] replacescene" method

+ (id) scenewithlevelname:(levelname)name {     ccscene *scene = [ccscene node];             shooterscene * shooterlayer = [[self alloc] initwithid:name];     [scene addchild:shooterlayer];       return scene;     } 

edit: realized stupidly did not include example objects , used primitive data type here paste snippets of elements in scenes: characterselection, shooterscene , planetselectionmenu:

//shooterscene @interface shooterscene : cclayer {     hudlayer * hudlayer;     .... }  @property(readwrite, nonatomic) ccspritebatchnode* backgroundandenemiesbatchnode; @property(readwrite, nonatomic) shipentity* playership; ... etc..   please note not declare member variables properties playership , backgroundandenemiesbatchnode beause, far can understand, should suffice property declaration (but please correct me if wrong or if approach may cause issues).   //characterselectionscene @interface characterselectionscene : cclayer {     int currentlyselectedcharacterspritetag;     ccsprite * lights;     cclayer * spriteslayer;         ... }  //planetselectionmenu #import <foundation/foundation.h> #import "cocos2d.h"  @interface planetselectionmenu : cclayer {     cclayer * backgroundlayer; // added background images here     cclayer * alwayspresentitems; }  + (id) scene;  @end 

please note each time go planetselectionmenu characterselectionscene -and vice versa- memories increases. in case have not used properties "just" added objects (ccsprites) layers , batchnodes.

edit 2: here see in allocation when running through menu->characterselection->planetselectionscene etc.. seem on avarage livebytes 4mb and, see 1 scene @ time assume there no retain cycles. why nasty low memory messages?

enter image description here

although default property attribute strong, can't properties causing retain cycle primitive types , default assign

three other common methods of introducing retain cycles jump mind:

  • are implementing delegate pattern anywhere (@protocols). delegate's weak references necessary?
     -(id) initwithdelegate:(id) target     {         ...         _target = target;   //_target should weak reference         ...     } 
  • do of children nodes reference parents?
     -(id) initwithparent:(ccnode*) parentnode     {         ...         _parent = parentnode; //_parent should weak reference.         ...     } 
  • do blocks reference self
    ^{[self callsomemethod];} 

should use weak reference self:

    __weak typeof(self) selfreference = self;    ^{[selfreference callsomemethod];} 

i find best way find leaks arc not use leaks tool, allocations tool. since of scenes tend have word "scene" in symbol, filter word scene.

since using replacescene should have 1 scene alive @ time (excepting during transition), should see 1 object in object summary.

enter image description here

if have scene that's hanging around, find it's best @ objects retain history. here, pair each retain corresponding release until find culprit(s) retaining , not releasing scene. more not it's obvious retain cycle block, or property declared strong instead of weak.

enter image description here


Comments

Popular posts from this blog

How to remove text and logo OR add Overflow on Android ActionBar using AppCompat on API 8? -

html - How to style widget with post count different than without post count -

url rewriting - How to redirect a http POST with urlrewritefilter -