programing

Objective-C에서 "@private"는 무엇을 의미합니까?

newstyles 2023. 4. 24. 22:58

Objective-C에서 "@private"는 무엇을 의미합니까?

무엇인가.@private목표-C의 평균은?

가시성 수식어입니다.인스턴스 변수가 다음과 같이 선언된 것을 의미합니다.@private는 같은 클래스의 인스턴스만 액세스할 수 있습니다.개인 구성원은 하위 클래스 또는 다른 클래스에서 액세스할 수 없습니다.

예를 들어 다음과 같습니다.

@interface MyClass : NSObject
{
    @private
    int someVar;  // Can only be accessed by instances of MyClass

    @public
    int aPublicVar;  // Can be accessed by any object
}
@end

또한 명확히 하기 위해 방법은 항상 Objective-C에서 공개된다.다만, 메서드 선언을 「숨기는」 방법도 있습니다.자세한 것에 대하여는, 이 질문을 참조해 주세요.

htw가 말했듯이, 그것은 가시성 수식어입니다. @privateivar(변수)는 같은 클래스의 인스턴스 내에서만 직접 액세스할 수 있음을 의미합니다.하지만, 그것은 당신에게 큰 의미가 없을지도 모르기 때문에, 예를 들어 보겠습니다.를 사용합니다.init예를 들어, 단순성을 위해 수업의 방법.관심 있는 항목을 지적하기 위해 인라인으로 댓글을 달겠습니다.

@interface MyFirstClass : NSObject
{
    @public
    int publicNumber;

    @protected  // Protected is the default
    char protectedLetter;

    @private
    BOOL privateBool;
}
@end

@implementation MyFirstClass
- (id)init {
    if (self = [super init]) {
        publicNumber = 3;
        protectedLetter = 'Q';
        privateBool = NO;
    }
    return self;
}
@end

@interface MySecondClass : MyFirstClass  // Note the inheritance
{
    @private
    double secondClassCitizen;
}
@end

@implementation MySecondClass
- (id)init {
    if (self = [super init]) {
        // We can access publicNumber because it's public;
        // ANYONE can access it.
        publicNumber = 5;

        // We can access protectedLetter because it's protected
        // and it is declared by a superclass; @protected variables
        // are available to subclasses.
        protectedLetter = 'z';

        // We can't access privateBool because it's private;
        // only methods of the class that declared privateBool
        // can use it
        privateBool = NO;  // COMPILER ERROR HERE

        // We can access secondClassCitizen directly because we 
        // declared it; even though it's private, we can get it.
        secondClassCitizen = 5.2;  
    }
    return self;
}

@interface SomeOtherClass : NSObject
{
    MySecondClass *other;
}
@end

@implementation SomeOtherClass
- (id)init {
    if (self = [super init]) {
        other = [[MySecondClass alloc] init];

        // Neither MyFirstClass nor MySecondClass provided any 
        // accessor methods, so if we're going to access any ivars
        // we'll have to do it directly, like this:
        other->publicNumber = 42;

        // If we try to use direct access on any other ivars,
        // the compiler won't let us
        other->protectedLetter = 'M';     // COMPILER ERROR HERE
        other->privateBool = YES;         // COMPILER ERROR HERE
        other->secondClassCitizen = 1.2;  // COMPILER ERROR HERE
    }
    return self;
}

따라서 질문에 답하기 위해 @private는 다른 클래스의 인스턴스에서 ivar를 액세스로부터 보호합니다.MyFirstClass의 두 인스턴스는 서로의 ivar 모두에 직접 액세스할 수 있습니다.프로그래머는 이 클래스를 직접 제어할 수 있기 때문에 이 기능을 현명하게 사용할 수 있습니다.

다른 사람이 액세스 할 수 없다고 했을 때의 의미를 이해하는 것이 중요합니다.@privateinstance 변수.실제 이야기는 소스 코드에서 이러한 변수에 액세스하려고 하면 컴파일러가 오류를 발생시킨다는 것입니다.이전 버전의 GCC 및 XCode에서는 오류 대신 경고만 표시되었습니다.

어느 쪽이든, 실행 시간에는 모든 베팅이 취소됩니다.이것들@private그리고.@protectedivars는 임의의 클래스의 오브젝트로 액세스 할 수 있습니다.이러한 가시성 수식어는 소스 코드를 가시성 수식자의 의도를 위반하는 기계 코드로 컴파일하는 것을 어렵게 할 뿐입니다.

보안을 위해 ivar 가시성 수정자에 의존하지 마십시오.그들은 전혀 제공하지 않는다.그것들은 전적으로 학급 설립자의 희망에 대한 컴파일 타임 시행을 위한 것이다.

언급URL : https://stackoverflow.com/questions/844658/what-does-private-mean-in-objective-c