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]