Re: Why so many public properties all up in my grizzle?
Re: Why so many public properties all up in my grizzle?
- Subject: Re: Why so many public properties all up in my grizzle?
- From: Conrad Shultz <email@hidden>
- Date: Fri, 16 Mar 2012 14:56:39 -0700
On 3/16/12 2:00 PM, Brian Lambert wrote:
> This means that my UILabel called labelMyLabel is publicly available.
> Anyone who has access to an instance of MyViewController can do anything
> they want to with my label, including replacing it.
>
> Also, anyone who has an instance of MyViewController can call my
> buttonDoItTouchUpInside action.
In addition to David's remarks, it should also be noted that there isn't
really any concept of "private" properties or methods (in the enforced
sense) in Objective-C due to the dynamic nature of the language and
runtime. No matter where you *declare* your properties and/or methods,
what you state above would always be possible.
(As an aside, major features in Cocoa rely on fairly crazy runtime
manipulation. For example, key-value observing:
http://mikeash.com/pyblog/friday-qa-2009-01-23.html)
Suppose you wanted to peek under a class' hood (for curiosity's sake, of
course; private API usage is generally a bad idea and is explicitly
forbidden in the App Stores and from discussion on the official mailing
lists). To see a class' properties (both from itself and its protocols)
you could try something along the lines of (warning: a thrown together
quick hack, probably has bugs):
unsigned int propertyCount;
objc_property_t *allProperties = class_copyPropertyList([MyClassName
class], &propertyCount);
for (NSUInteger i = 0; i < propertyCount; i++) {
const char *name = property_getName(allProperties[i]);
NSLog(@"%s", name);
}
unsigned int protocolCount;
Protocol **allProtocols = class_copyProtocolList([MyClassName
class], &protocolCount);
for (NSUInteger i = 0; i < protocolCount; i++) {
const char *protocol = protocol_getName(allProtocols[i]);
NSLog(@"PROTOCOL %s", protocol);
unsigned int protoPropertyCount;
objc_property_t *protoProperties =
protocol_copyPropertyList(allProtocols[i], &protoPropertyCount);
for (NSUInteger j = 0; j < protoPropertyCount; j++) {
const char *propName = property_getName(protoProperties[j]);
NSLog(@"\t%s", propName);
}
}
This and other fun hackery is documented in the Runtime Programming
Guide:
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide
--
Conrad Shultz
Synthetiq Solutions
www.synthetiqsolutions.com
_______________________________________________
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