Objective c 目标C类方法控制所有现有实例?

Objective c 目标C类方法控制所有现有实例?,objective-c,Objective C,是否可以使用我创建的某些NSObject的类方法来控制所有现有实例 我希望委托类能够将消息发送到对象的类方法,然后这些类方法可以对那里的所有内容做出适当的反应。不使用一些对象集合是不行的。最简单的方法是将对象存储在一个数组中,并在希望发生某些事情时向所有对象发送一条消息。具体而言: static NSMutableArray *allObjects = nil; + (void) initialize { if (!allObjects) { allObjects = [

是否可以使用我创建的某些NSObject的类方法来控制所有现有实例


我希望委托类能够将消息发送到对象的类方法,然后这些类方法可以对那里的所有内容做出适当的反应。

不使用一些对象集合是不行的。最简单的方法是将对象存储在一个数组中,并在希望发生某些事情时向所有对象发送一条消息。具体而言:

static NSMutableArray *allObjects = nil;
+ (void) initialize {
    if (!allObjects) {
        allObjects = [NSMutableArray new];
    }
}
- (id) init {
    if (self = [super init]) {
        //Each object gets held in an array
        [allObjects addObject:self];
    }
    return self;
}
+ (void) doSomethingToEveryObject {
    [allObjects makeObjectsPerformSelector:@selector(doSomethingToThisObject)];
}
- (void) doSomethingToThisObject {
    NSLog(@"Did something to %@",self];
}
- (void) release {
    [super release];
    //When the retain count reaches 1, then all external references have disappeared,
    //and the only remaining reference is in the objects array.
    if (self.retainCount == 1) {
      [allObjects removeObject:self];
    }
}

当然。只要让所有对象在创建时注册即可。例如:

- (id)init {
    self = [super init];
    if (!self) return nil;

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(announceYourself:)
                                                 name:@"MYCLASS_ANNOUNCE"
                                               object:nil];
    return self;
}

+ (void)identifyInstances {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MYCLASS_ANNOUNCE" object:self];
}

- (void)announceYourself:(id)notification {
    NSLog(@"Instance %p reporting in!", self);
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self]; // VERY IMPORTANT -- IT WILL CRASH WITHOUT THIS
    [super dealloc];
}

虽然这样做是可行的,但重写像release这样的方法总是让我觉得可疑。只要您知道自己在做什么,就可以这样做。如果不想重写release方法,也可以创建自己的数组类,该类不保留其成员。要避免三行函数似乎需要做很多工作。不。太可怕了。如果NSPointerArray不存在可以配置为不保留其元素的Objective-C数组,那么这可能是合理的。感谢Ed,这看起来像是我在概念上考虑的方法,但我应该使用NSPointerArray而不是NSMutableArray?对不起,我是iPhone开发人员;我不知道NSPointerArray,因为它在iPhone SDK中不存在。用它来代替是有意义的。