オブジェクトのすべてのプロパティの変更をサブスクライブする組み込み関数はないようです。
どのプロパティが正確に変更されたかを気にせず、クラスを変更できる場合は、それにダミー プロパティを追加して、他のプロパティの変更を観察できます (+ keyPathsForValuesAffectingValueForKey
または+keyPathsForValuesAffecting<Key>
メソッドを使用):
// .h. We don't care about the value of this property, it will be used only for KVO forwarding
@property (nonatomic) int dummy;
#import <objc/runtime.h>
//.m
+ (NSSet*) keyPathsForValuesAffectingDummy{
NSMutableSet *result = [NSMutableSet set];
unsigned int count;
objc_property_t *props = class_copyPropertyList([self class], &count);
for (int i = 0; i < count; ++i){
const char *propName = property_getName(props[i]);
// Make sure "dummy" property does not affect itself
if (strcmp(propName, "dummy"))
[result addObject:[NSString stringWithUTF8String:propName]];
}
free(props);
return result;
}
プロパティを監視するdummy
と、オブジェクトのプロパティが変更されるたびに KVO 通知を受け取ります。
また、投稿されたコードのようにオブジェクト内のすべてのプロパティのリストを取得し、ループ内でそれぞれの KVO 通知をサブスクライブすることもできます (したがって、プロパティ値をハードコーディングする必要はありません) - このようにして、変更されたプロパティを取得します。必要に応じて名前を付けます。