TOP - Objective-C - @protected

インスタンス変数の有効範囲をクラス内および継承されるクラス内とします。
有効範囲の指定を行わない場合は、@protectedが適用となります。

@protected リスト1
リスト1  : インスタンス変数宣言リスト
           次のコンパイラ指定が出現するまで有効

(例)
※ Xcodeで生成される「***_Prefix.pch」などのファイルの内容は記載しません。

#import <Foundation/Foundation.h>

@interface MyTestClass1 : NSObject
{
    NSString *messageString1;    // 有効範囲指定無し(デフォルトは@protected)
    @protected
        NSString *messageString2;
    @private
        NSString *messageString3;
}
- (void)testMethod;
@end

@implementation MyTestClass1
- (void)testMethod
{
    messageString1 = [NSString stringWithFormat:@"messageString1"];
    messageString2 = [NSString stringWithFormat:@"messageString2"];
    messageString3 = [NSString stringWithFormat:@"messageString3"];
    NSLog(@"MyTestClass1 : %@ %@ %@", messageString1, messageString2, messageString3);
}
@end

@interface MyTestClass2 : MyTestClass1
- (void)testMethod;
@end

@implementation MyTestClass2
- (void)testMethod
{
    NSString *messageString1 = [NSString stringWithFormat:@"messageString1_2"];
    NSString *messageString2 = [NSString stringWithFormat:@"messageString2_2"];
    NSString *messageString3 = [NSString stringWithFormat:@"messageString3_2"];

    NSLog(@"MyTestClass2 : %@ %@ %@", messageString1, messageString2, messageString3);
    // messageString1、messageString2はインスタンス変数にアクセス可能なため、
    // インスタンス変数が隠されている旨の警告発生
    // @private指定されているmessageString3には警告無し
}
@end

int main (void)
{
    MyTestClass1 *c1 = [[MyTestClass1 alloc] init];
    MyTestClass2 *c2 = [[MyTestClass2 alloc] init];

    [c1 testMethod];
    [c2 testMethod];

    return 0;
}

実行結果
MyTestClass1 : messageString1 messageString2 messageString3
MyTestClass2 : messageString1_2 messageString2_2 messageString3_2


Copyright(C) 2006-2013 CLAYPOT. All Rights Reserved.