This is more of an Cocoa programming discussion than QC, but read up on memory 
management to get a handle on why this is, and what the different techniques 
mean. You will suffer endlessly until you do!


The quick answers, if you're feeling lazy, are:

1. Don't create your dictionary in startExecution unless you really have to, 
you're complicating matters by creating an object and keeping it around. 
Creating a new one on each execute: is fairly lightweight, I doubt that's going 
to contribute much to your CPU load if that's what you're worried about.

2. [NSMutableDictionary new] is a shorthand for [[NSMutableDictionary alloc] 
init] which also retains the object in a non-GC environment. So no additional 
retain is needed (only a release, later).

Using a convenience constructor like +[NSMutableDictionary dictionary] appears 
to be more complex because it'll give you an autoreleased object which could go 
on to cause a crash, but it makes your code easier to read because it's easy to 
balance a single retain with a single release. Also, if you set a property to 
an autoreleased object, the synthesized setter should retain and release it for 
you, automatically - so you get even simpler code and there's no need to retain 
or release yourself.

3. Whatever you do, don't continually retain an object on each execute:! You're 
just incrementing the retain counter madly. If your composition was to 
continually stop and start, you'd be leaking memory.


A.


On 28 Sep 2010, at 12:56, Stefan Kainbacher, NEON GOLDEN wrote:

> cheers adrian, that was it. i changed it to the following ...
> 
> 
> - (BOOL) startExecution:(id<QCPlugInContext>)context
> {
>       
>       particles = [NSMutableDictionary new];
>       
>       return YES;
> }
> 
> 
> - (BOOL) execute:(id<QCPlugInContext>)context atTime:(NSTimeInterval)time 
> withArguments:(NSDictionary*)arguments
> {
>       
>       NSLog(@"Amount: %i", self.inputAmount);
>       
>       //[particles removeAllObjects];
>       
>       for(int i=0;i<self.inputAmount;i++){
>       
>               NSDictionary *dictionary = [NSDictionary 
> dictionaryWithObjectsAndKeys:
>                                                                       
> [NSString stringWithFormat:@"%i", rand()], @"x",
>                                                                       
> [NSString stringWithFormat:@"%i", rand()], @"y",
>                                                                       
> [NSString stringWithFormat:@"%i", rand()], @"z",
>                                                                       
> [NSString stringWithFormat:@"%i", rand()], @"random value",
>                                                                       nil];
>               [particles setObject:dictionary forKey:[NSString 
> stringWithFormat:@"%i",i]];
>       }
>       
>       //[self.outputParticles setDictionary:particles];
> 
>       [particles retain];
>       self.outputParticles = particles;
>       
>       return YES;
> }
> 
> 
> - (void) stopExecution:(id<QCPlugInContext>)context
> {
>       
>       [particles release];
>       
> }
> 
> 
> why do i have to retain it? is it because of the "particles = 
> [NSMutableDictionary new];"? do i have to release it one more time, or ist 
> correct now?
> 
> 
> 
> On Sep 28, 2010, at 12:25 PM, Adrian Ward wrote:
> 
>> 
>> Are you sure you're retaining your particles dictionary so its not being 
>> autoreleased? I can't see where you've created it so cannot be certain. This 
>> sort of mistake often causes these sorts of crashes (works initially, 
>> doesn't shortly after).
>> 
>> An easier and probably safer approach would be to just set your 
>> outputParticles property directly to a new dictionary that you create each 
>> time, rather than trying to maintain one mutable object over time, and then 
>> having to retain it, etc.
>> 
>> And finally, to answer your source comment, no they're not the same - the 
>> first one changes the contents of your self.outputParticles dictionary to 
>> match those of particles. The second one assigns (depending on your 
>> @property declaration) the object directly to the property, which is what 
>> you're wanting.
>> 
>> Try this:
>> 
>> NSMutableDictionary* particles = [NSMutableDictionary dictionary];
>> 
>> for(int i=0;i<self.inputAmount;i++){
>>      NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
>>                                                                      
>> [NSString stringWithFormat:@"%i", rand()], @"x",
>>                                                                      
>> [NSString stringWithFormat:@"%i", rand()], @"y",
>>                                                                      
>> [NSString stringWithFormat:@"%i", rand()], @"z",
>>                                                                      
>> [NSString stringWithFormat:@"%i", rand()], @"random value",
>>                                                                      nil];
>>      [particles setObject:dictionary forKey:[NSString 
>> stringWithFormat:@"%i",i]];
>> }
>> self.outputParticles = particles;
>> 
>> 
>> 
>> 
>> Best,
>> 
>> A.
>> 
>> 
>> On 28 Sep 2010, at 10:57, Stefan Kainbacher, NEON GOLDEN wrote:
>> 
>>> 
>>> hello together, 
>>> 
>>> i would like to build a plugin that has one input (number) and an output 
>>> (structure).
>>> 
>>> if i change the the number on the input it should give me a a dictionary or 
>>> array with n=inputNumber elements. it works the first time and hands out 
>>> the structure in qc, but when i change the input qc crashes. whats wrong? 
>>> what do i miss?
>>> 
>>> 
>>> - (BOOL) execute:(id<QCPlugInContext>)context atTime:(NSTimeInterval)time 
>>> withArguments:(NSDictionary*)arguments
>>> {
>>>     
>>>     NSLog(@"Amount: %i", self.inputAmount);
>>>     //[particles removeAllObjects];
>>>     
>>>     for(int i=0;i<self.inputAmount;i++){
>>>     
>>>             NSDictionary *dictionary = [NSDictionary 
>>> dictionaryWithObjectsAndKeys:
>>>                                                                     
>>> [NSString stringWithFormat:@"%i", rand()], @"x",
>>>                                                                     
>>> [NSString stringWithFormat:@"%i", rand()], @"y",
>>>                                                                     
>>> [NSString stringWithFormat:@"%i", rand()], @"z",
>>>                                                                     
>>> [NSString stringWithFormat:@"%i", rand()], @"random value",
>>>                                                                     nil];
>>>             [particles setObject:dictionary forKey:[NSString 
>>> stringWithFormat:@"%i",i]];
>>>     }
>>>     
>>>     [self.outputParticles setDictionary:particles];  // BTW: IS THIS THE 
>>> SAME? self.outputParticles = particles;  
>>>     
>>>     return YES;
>>> }
>>> 
>>> 
>>> full source download (2.5 mb) available here:
>>> 
>>> http://dl.dropbox.com/u/950822/Quartz%20Composer/NG%20ParticleSystem%2001.zip
>>> 
>>> 
>>> cheers, stefan
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Quartzcomposer-dev mailing list      ([email protected])
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/quartzcomposer-dev/stefan%40neongolden.net
>> 
>> This email sent to [email protected]
> 
> --
> NEW phone number: 0676 60 33 989
> 
> --
> NEON GOLDEN
> VISUAL EXPERIMENT
> 
> lab.neongolden.net
> 
> --
> www.respectyourvj.net
> 
> 
> 
> 
> 

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to