0

私はまだ Objective-C を使い始めたばかりで、プロパティの作成方法を最近学びました。
次のコードがあるとしましょう:

// myClass.h
@interface myClass : NSObject {
int _startPos;
}
@property (assign, readwrite, setter = setStartPos:, getter = getStartPos) int startPos;
-(void) setStartPos: (int) pos;
-(int) getStartPos;
@end

実装ファイルは自明である必要があります。具体的なことをしようとしているわけではありません。
さて、私はどこかで読んで、実装ファイルにカテゴリを作成し、それにいくつかのメソッドを追加すると、それらのメソッドを myClass.m ファイルの外のものから見えないようにすることができることを実際に試しました。

「よし」と思い、試してみることにしました。

//myClass.m
#import <Foundation/Foundation.h>
#import "myClass.h"

@interface myClass (hidden)
-(void) setHiddenStartPos: (int) hPos;
-(int) getHiddenStartPos;
@end

@implementation myClass (hidden)
-(void) setHiddenStartPos: (int) hPos {
_startPos = hPos;
}

-(int) getHiddenStartPos {
return _startPos;
}
@end

@implementation myClass
-(void) setStartPos: (int) Pos {
[self setHiddenStartPos: Pos];
}

-(int) getStartPos {
return [self getHiddenStartPos]; //this is to see if I can get the value from the hidden methods through the non-hidden ones
}
@end

それはすべて問題なく、 main()でテストすると、名前に「hidden」が含まれるメソッドは実際にはアクセスできないため、プライベートであるかのように動作することがわかります。

次に、これをヘッダーファイルに追加しようとしました:

@property (assign, readwrite, setter = setHiddenStartPos:, getter = getHiddenStartPos) int

プロパティを介して隠しメソッドにアクセスできるかどうかを確認しました
が、そうすると、隠しメソッドがmain()でアクセス可能になり、プロパティを介してのみメソッドにアクセスできるようにする計画全体が無駄になりました

だから私はあなたに尋ねる、メソッドがプロパティやオブジェクト自体にアクセスできないようにする方法はありますか?

編集:ゲッターの名前には通常 get が含まれていないので、コメントするのはやめてください。

また、私が意図したことを強調するために: セッターとゲッターのコンテンツがプロパティ自体にプライベートである c# のようなプロパティを作成したかった

public int exampleProperty
{
    set{...}
    get{...}
}

メソッドをゲッターおよびセッターとして使用しないため、メソッド内のコードがメソッド自体に対してローカルであるのと同様に、セッターおよびゲッターのコードはプロパティからのみアクセスできます。

4

3 に答える 3

4

.m ファイルにクラス継続を追加します。すなわち:

@interface myClass ()
@property (assign, readwrite, setter = setHiddenStartPos:, getter = getHiddenStartPos) int hiddenStartPos;
@end

@implimentation myClass
@synthesize hiddenStartPos = _hiddenStartPos;
...
@end

以下をご覧ください: Objective-C の「クラス継続」とは?

PS: ゲッターは...hiddenStartPosではなく、単にする必要があります。getHiddenStartPos

于 2012-08-12T13:44:47.990 に答える
2

あなたの混乱は、 @property 宣言とは何かを正確に誤解していることに起因しているように思えます。基本的には、setter メソッドと getter メソッドが存在するという宣言です。

したがって、この

@property int hiddenStartPos;

これと同じです

- (int)hiddenStartPos;
- (void)setHiddenStartPos;

したがって、これら 2 つのメソッドの実装は、プロパティの実装です。.h ファイルでプロパティを宣言することにより、問題のクラスがこれら 2 つのメソッド (それぞれゲッターとセッター) を実装していることを .h をインポートする人に宣伝します。

また、Objective-C では getter メソッドの前に「get」を付けるべきではないことを再度強調したいと思います。

于 2012-08-12T14:52:21.430 に答える
1

あなたは「プライベート」の意味を考えすぎています。ObjC では、「プライベート」は単に「見えない」という意味です。「呼び出せない」という意味ではありません。メソッドをプライベートにする方法は.h、パブリック インターフェイスを宣言するファイルにメソッドを配置しないことです。

誰がメッセージを渡すかを制御する方法はありません。これは ObjC の重要な事実であり、変更することはできません (変更すべきではありません)。ObjC は動的言語です。実行時には、自由にセレクターを生成performSelector:し、任意のオブジェクトを呼び出すことができます。(a) 重大なパフォーマンス ペナルティを導入するか、(b) ObjC の多くの非常に有用で一般的な手法を壊す (おそらく両方)。ObjC は Java や C# ではありません。C や C++ でさえありません。それは C の上にある Smalltalk です。非常に動的な言語であり、多くの長所があります。他の言語の学習をやめることは、優れた Cocoa 開発者になるための第一歩です。

@privateメソッド (プロパティは特殊なケースにすぎません) をコンパイラでチェックするのは素晴らしいことです。特に、メソッドをコンパイラでチェックするのは素晴らしいことです@protected(これらは ivar に存在します)。これらにより、ある種の間違いを避けるのが少し簡単になります。しかし、それはあなたがこれについて考えるべき唯一の方法です。目的は、コードの一部をコードの別の部分から保護することではありません。他のコードは敵ではありません。これはすべて、プログラムを機能させたいと考えている人々によって書かれています。目標は、間違いを避けることです。正しい命名、一貫性、および警告の完全な排除は、ObjC でそれを実現する方法です。

そうです、私は時々私の宣言@protectedの前に置くことができるのが大好きです. @property今日ではできませんし、実際に相当するものもありません (+Protected別のヘッダーでカテゴリを使用することもありますが、一般的には、その価値よりも問題が大きくなります)。とはいえ、持っていてもさほど変わらず、年に数回しか使わないケースしかありません。@privateただし、メソッドが本当に便利だったという単一のケースは考えられません。

于 2012-08-12T20:25:41.520 に答える