Re: Send msg to object by nameed NSString;
Re: Send msg to object by nameed NSString;
- Subject: Re: Send msg to object by nameed NSString;
- From: Trygve Inda <email@hidden>
- Date: Wed, 18 Jun 2014 17:57:16 -0700
- Thread-topic: Send msg to object by nameed NSString;
>
> On 19 Jun 2014, at 4:53 am, Daniel DeCovnick <email@hidden> wrote:
>
>> Yes. You can either use key-value coding: [[self valueForKey:myString]
>> release];
>
>
>> [value release];
>
>
>
> These invocations of -release appear to be erroneous. Why do you have them
> there? If you think they should be there as a matter of routine, your
> understanding of memory management is probably faulty.
>
> --Graham
>
The reason for this is I have several classes with only properties (no
methods other than getters/setters created with synthesize).
The method propertyKeys (below) is used to simplify and shorten the code in
these classes since I want to encode/decode and (upon dealloc), release all
the properties.
In the example below there is only one property, but in reality there are
many.
The interface looks like:
@interface MyClass : NSObject <NSCoding>
{
NSNumber* someValue;
}
@property (nonatomic, retain) NSNumber* someValue;
The implementation looks like:
@implementation MyClass
@synthesize someValue;
-(id)init
{
if (self = [super init])
{
[self setSomeValue:[NSNumber numberWithInt:3];
}
return self;
}
-(void)dealloc
{
for (NSString* key in [self propertyKeys])
[[self valueForKey:key] release];
[super dealloc];
}
-(id)initWithCoder:(NSCoder *)coder
{
if (self = [self init])
{
for (NSString* key in [self propertyKeys])
{
if ([coder containsValueForKey:key])
[self setValue:[coder decodeObjectForKey:key] forKey:key];
}
}
return (self);
}
-(void)encodeWithCoder:(NSCoder *)coder;
{
for (NSString* key in [self propertyKeys])
[coder encodeObject:[self valueForKey:key] forKey:key];
}
-(NSArray *)propertyKeys
{
NSMutableArray* propertyKeyArray =
[[[NSMutableArray alloc] init] autorelease];
unsigned int outCount, i;
objc_property_t* properties =
class_copyPropertyList([self class], &outCount);
if (properties)
{
for(i = 0; i < outCount; i++)
{
objc_property_t property = properties[i];
const char* propName = property_getName(property);
if(propName)
{
NSString* propertyName =
[NSString stringWithUTF8String:propName];
[propertyKeyArray addObject:propertyName];
}
}
free(properties);
}
return (propertyKeyArray);
}
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden