• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Why so many public properties all up in my grizzle?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

  • Follow-Ups:
    • Re: Why so many public properties all up in my grizzle?
      • From: Ian Joyner <email@hidden>
References: 
 >Why so many public properties all up in my grizzle? (From: Brian Lambert <email@hidden>)

  • Prev by Date: Re: Transition from [NSEvent phase] to [NSEvent momentumPhase]
  • Next by Date: Re: Why so many public properties all up in my grizzle?
  • Previous by thread: Re: Why so many public properties all up in my grizzle?
  • Next by thread: Re: Why so many public properties all up in my grizzle?
  • Index(es):
    • Date
    • Thread