目标c中的访问修饰符可见性

ris*_*shi 3 iphone cocoa objective-c

有3个修饰符:@ private,@ protected(默认)和@public.因此,如果我将实例变量定义为私有,那么不应该从任何地方访问它.对于Eg -

@interface A {
    @private
    NSString *a;
}
@property(nonatomic, retain) NSString *a;
Run Code Online (Sandbox Code Playgroud)

现在内部实现一些其他接口/类B-

-(void)getSomeValue {
     A *object = [[A alloc] init];
     NSString *value = object.a;
     .........
 }
Run Code Online (Sandbox Code Playgroud)

在这里,我能够访问实例变量,虽然我将其定义为私有.

这有点令人困惑,虽然当我查看这个语句的细节时,很明显它正在调用a的getter,但是它也似乎令人困惑,它违背了OOPS的概念.

有没有想过这个?

tob*_*yer 10

它不是您正在访问的实例变量,而是您声明的属性.如果您不希望实例变量在类外部可见,请不要声明该属性.

  • 同样,您没有访问私有变量.您声明它是此类的属性.所以你为它生成了一个getter和一个setter.变量仍然是私有的.访问方法不是. (10认同)

Pau*_*l.s 8

#import <Foundation/Foundation.h>

@interface Visibility : NSObject {
@public    
    BOOL boolPublic;
@protected 
    BOOL boolProtected;
@private
BOOL boolPrivate;
}

@property (nonatomic, assign) BOOL boolPublic;
@property (nonatomic, assign) BOOL boolProtected;
@property (nonatomic, assign) BOOL boolPrivate;

@end

@implementation Visibility

@synthesize boolPublic;
@synthesize boolProtected;
@synthesize boolPrivate;

@end

int main(int argc, char *argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Visibility *visibility = [[Visibility alloc] init];

    visibility.boolPublic    = YES;
    visibility.boolProtected = YES;
    visibility.boolPrivate   = YES;

    // Place following NSLog()'s here

    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

我们来试试吧

使用@ property/@ synthesize定义的方法

NSLog(@"Accessors %d %d %d", visibility.boolPublic, visibility.boolProtected, visibility.boolPrivate);

=> 2012-01-08 17:46:40.226 Untitled[2592:707] Accessors 1 1 1
Run Code Online (Sandbox Code Playgroud)

直接访问@public ivar

NSLog(@"Public %d", visibility->boolPublic);

=> 2012-01-08 17:46:40.228 Untitled[2592:707] Public 1
Run Code Online (Sandbox Code Playgroud)

直接访问@protected ivar

NSLog(@"Protected %d", visibility->boolProtected);

=> error: instance variable 'boolProtected' is protected
=> NSLog(@"Protected %d", visibility->boolProtected);
=>                                    ^
Run Code Online (Sandbox Code Playgroud)

直接访问@private ivar

NSLog(@"Private %d", visibility->boolPrivate);

=> error: instance variable 'boolPrivate' is private
=> NSLog(@"Private %d", visibility->boolPrivate);
=>                                  ^
Run Code Online (Sandbox Code Playgroud)

当您使用点表示法访问时:

visibility.boolPublic
Run Code Online (Sandbox Code Playgroud)

相当于:

[visibility boolPublic]; // <- This is a method call
Run Code Online (Sandbox Code Playgroud)