[Drawkit] get tool controller?

James Maxwell jbmaxwell at rubato-music.com
Tue Feb 17 18:26:06 PST 2009


Thanks for the tips, Graham.
No luck yet, but I'll keep trying. This class has used mostly factory  
methods, so I'm a bit surprised that I'm having these problems (unless  
you know of some hidden dangers with factory methods). And I can't  
find any other methods with this name, unless there's something in DK  
- the method is just (void) -addLevel:, and takes no arguments.  
Strange that it's giving me troubles... The errors range from  
EXC_BAD_ACCESS to just finding some bizarre other chunk of data in  
memory. Who knows?

thanks,

J.


On 17-Feb-09, at 4:19 PM, Graham Cox wrote:

>
> On 18 Feb 2009, at 10:35 am, James Maxwell wrote:
>
>> I do have another question, though... I have a class which  
>> initializes just fine, and seems fine, but when I try to use one of  
>> its methods, I find that one of its instance variables contains a  
>> completely foreign object - and this changes arbitrarily! I'm  
>> guessing there's something somewhere that's been freed, leaving my  
>> instance variable is pointing to some garbage space, but I've no  
>> idea how to track down the problem.
>> Any tips? I haven't had this problem, so far...
>
>
> It does sound like something freed that shouldn't be. These can be  
> tricky to find, but start by setting NSZombieEnabled to YES  
> (highlight the executable in Xcode, do Get Info, Arguments, and add  
> NSZombieEnabled to 'variables to be set in the environment'). This  
> won't catch the problem directly (i.e. show you where the erroneous  
> free is) but it will drop you into the debugger next time the object  
> is accessed. With luck this will be soon afterwards and will help  
> pinpoint the problem. Make sure you turn NSZombieEnabled off for  
> final builds though, because it prevents object memory being  
> reclaimed.
>
> Is it a DK object? What ivar is it?
>
> Do a search for the ivar name and check every place you access it is  
> doing the right thing by the memory management rules. If you release  
> it anywhere other than dealloc, you should also set it to nil if  
> it's not being reassigned.
>
> Another cause of this could be code that is overwriting the variable  
> with garbage. These can be b*****s to find. Sometimes it can be due  
> to code that has been compiled based on incorrect assumptions, so if  
> you have any warnings such as '<foo> may not respond to <bar>,  
> methods without a matching signature are assumed to return id and  
> take ... as arguments' are worth paying special attention to.   
> General advice is never ignore warnings - make sure you can compile  
> without generating any warnings.
>
> Also be very careful about return types. If you have two methods  
> with the same name but differently sized return types, e.g.:
>
> - (NSPoint)	getValue;
> - (int)		getValue;
>
> If the compiler plumps for the wrong one, it will corrupt the stack  
> at runtime, and you don't get a warning at compile time either. This  
> can happen when you use the anonymous object type (id) with such a  
> method. It's best to avoid using id if you can supply a more  
> explicit class. This happens because the compiler doesn't care about  
> return type when matching a method signature, and if it has nothing  
> else to go on (like the object class) it simply uses the first  
> matching method that it happens to find in its symbol table. It will  
> merrily compile according to the found return type, assuming that  
> the surrounding code is consistent with it. But the reality is that  
> the return type matters, and getting it wrong can cause serious  
> corruption. This is a GCC bug. Rare, but real.
>
> Here's one situation that this cropped up for me:
>
> NSComparisonResult  comparisonFunction( id objectA, id objectB,  
> void* info )
> {
>    float a = [objectA getValue];
>    float b = [objectB getValue];
>
>   // compare a and b and return ordering
> }
>
> Because objectA and objectB are typed as id, the lookup for - 
> getValue will use the first it finds. If there are methods with the  
> same name but different return types, the compiled code can corrupt  
> the stack because a and b are typed as float, and thus only the  
> right amount of stack space to hold two floats is assigned. If - 
> getValue returns a NSPoint say, this won't fit in the stack space  
> allowed and will overflow, overwriting whatever happens to be in the  
> way. Sometimes even the same sizes can cause problems, like int and  
> float, because these are returned in different CPU registers.
>
> Getting rid of id and typing the objects more explicitly will fix  
> this.
>
> The chances of this being your problem are low, but as this is a  
> "silent killer" it's worth knowing about. It also bit me hard once,  
> and took days to pin down.
>
> --Graham
>
>
>
>
>
>
>
>
>
> _______________________________________________
> Drawkit mailing list
> Drawkit at lists.apptree.net
> http://lists.apptree.net/listinfo.cgi/drawkit-apptree.net



More information about the Drawkit mailing list