Hiding properties from public access

后端 未结 6 735
攒了一身酷
攒了一身酷 2020-12-07 22:53

I\'m trying to declare properties that are for internal use only in a Private category as such:

@interface BarLayer (Private)

@property (readwr         


        
6条回答
  •  难免孤独
    2020-12-07 23:37

    You can't use @synthesize with a category.

    You can do this with an class extension (a.k.a. anonymous category), which is just a category without a name whose methods must be implemented in the main @implementation block for that class. For your code, just change "(Private)" to "()" and use @synthesize in the main @implementation block along with the rest of your code for that class.

    See the Apple docs on extensions for more about that. (Apparently this is new in Mac OS 10.5.)

    EDIT: An example:

    // Main interface (in .h)
    @interface Foo : NSObject
    - (void)bar;
    @end
    
    // Private interface (in .m, or private .h)
    @interface Foo ()
    @property (nonatomic, copy) NSString *myData;
    @end
    
    @implementation Foo
    @synthesize myData; // only needed for Xcode 4.3 and earlier
    - (void)bar { ... }
    @end
    

    Another solution, which is much more work, is to use objc_setAssociatedObject and objc_getAssociatedObject to fake additional instance variables. In this case, you could declare these as properties, and implement the setters and getters yourself using the objc_* runtime methods above. For more detail on those functions, see the Apple docs on Objective-C runtime.

提交回复
热议问题