2016-10-03 11 views
0

私はGithubからソースコードのブロックを取得しています。このブロックコードは 'セクション' と呼ばれる2人の変数名を持っていますが、正常にビルド変数名を同じクラスに複製できますか?

ヘッダファイル

@interface VTDUpcomingDisplayData : NSObject 

@property (nonatomic, readonly, copy,) NSArray* sections; // array of VTDUpcomingDisplaySection 

+ (instancetype)upcomingDisplayDataWithSections:(NSArray *)sections; 

@end 

実装ファイル

#import "VTDUpcomingDisplayData.h" 


@interface VTDUpcomingDisplayData() 
@property (nonatomic, copy) NSArray* sections; 
@end 


@implementation VTDUpcomingDisplayData 

+ (instancetype)upcomingDisplayDataWithSections:(NSArray *)sections 
{ 
    VTDUpcomingDisplayData* data = [[VTDUpcomingDisplayData alloc] init]; 

    data.sections = sections; 


    return data; 
} 

:ように見えます。私は2つの質問があります:

  • まず、なぜこれが起こることが許されないのですか?
  • 第2に、ソースコードで必要な変数を正確に呼び出す方法は?

答えて

2

オーバーライドプロパティ属性またはプロパティの再宣言という、通常はObjective-Cにあります。インターフェイスにreadonlyのプロパティを宣言して、readwriteにすることができます(readwrite属性を明示的に指定する必要はありませんが、明示的に指定する必要はありません)。

Here'sアップルのドキュメントは、クラスの拡張でプロパティを再宣言について

クラスの拡張子は、多くの場合、クラス自体の 実装内で使用するための 追加のプライベートメソッドやプロパティを持つパブリックインターフェイスを拡張するために使用されています。例えば、 は、インターフェイスのreadonlyとしてプロパティを定義しますが、 クラスの内部メソッドがプロパティ値を直接変更できるように、実装の上に宣言された クラス拡張のreadwriteとして定義されています。

  • まず第一に、これは起こることが許可されている理由を、私は理解していませんか?

    それは、どのようにObjective-Cの

  • 秒で通常の動作を呼び出すことだという理由だけで、正確な私は、ソースコードにしたい変数?

    これは単なるプロパティです。内部メソッドでreadwriteとしてアクセスできます。しかし、他のクラスではそれはまだですreadonly

0

両方の宣言は、同じプロパティ(および基本となるインスタンス変数)を参照します。

ただし、プロパティはヘッダーと実装で異なって宣言されます。このオブジェクトの呼び出し元が使用するインターフェイスを定義するヘッダーでは、プロパティはreadonlyと宣言されています。クラスの実装では、同じプロパティがreadonly属性を欠いています。つまり、読み取り/書き込みです。

これは、クラスの実装のプロパティへの読み取りと書き込みのアクセスを許可しますが、クラスのユーザーはプロパティからの読み取りのみを許可します。誰もが同じプロパティ(インスタンス変数)にアクセスしていますが、唯一の違いはさまざまな呼び出し元のアクセス権です。

関連する問題