スタック オーバーフローに関するこのトピックに関する投稿はたくさんありますが、単純で具体的なアドバイスを提供するものはありませんが、このトピックはそれを最も簡潔にまとめており、Josh の回答はどの投稿よりも優れています。
彼が率直に言ってやめていることは、もしこれがあなたがやりたいことであるなら、@property をまったく使わないということです。彼が言うように、基本クラスで通常の保護された変数を宣言し、必要に応じて独自のセッターとゲッターであると記述します。ivar は、独自のセッター/ゲッターを作成できるすべてのサブクラスに表示されます。
私はサブクラス化に完全に慣れていませんが、少なくともそれが私がこの問題にたどり着いた場所です。
匿名カテゴリをホストするプライベート ヘッダーを作成し、サブクラスで ivar を再 @sythesizing するという考えは、非常に多くのレベルで間違っているように思えます。また、おそらくどこかで基本的な点を見逃していると確信しています。
編集
睡眠不足の後、スタンフォード大学の 2013 年 iTunes U コースに触発されて、ここにこの問題の解決策の例があると思います。
MYFoo.h
#import <Foundation/Foundation.h>
@interface MYFoo : NSObject
// Optional, depending on your class
@property (strong, nonatomic, readonly) NSString * myProperty;
- (NSString *)makeValueForNewMyProperty; //override this in your subclass
@end
MYFoo.m
#import "MYFoo.h"
@interface MYFoo ()
@property (strong, nonatomic, readwrite) NSString * myProperty;
@end
@implementation MYFoo
// Base class getter, generic
- (NSDateComponents *)myProperty {
if (!_myProperty) {
_myProperty = [self makeValueForNewMyProperty];
}
return _myProperty;
}
// Replace this method in your subclass with your logic on how to create a new myProperty
- (NSString *)makeValueForNewMyProperty {
// If this is an abstract base class, we'd return nil and/or throw an exception
NSString * newMyProperty = [[NSString alloc]init];
// Do stuff to make the property the way you need it...
return newMyProperty;
}
@end
次に、サブクラスの makeValueForNewMyProperty を必要なカスタム ロジックに置き換えるだけです。プロパティは基本クラスで「保護」されていますが、作成方法を制御できます。これは、ほとんどの場合、基本的に達成しようとしていることです。
makeValueForNewMyProperty メソッドが基本クラスの他の ivar へのアクセスを必要とする場合、それらは少なくともパブリックな読み取り専用プロパティ (または単なるネイキッド ivar) である必要があります。
正確に「ゲッターをオーバーライドする」わけではありませんが、少し考えれば、同じようなことを達成できます。例を一般的なものにしようとして、優雅さと明快さが失われてしまったことをお詫びします。