Changeset 24151
- Timestamp:
- 07/01/2008 05:09:23 PM (5 months ago)
- Files:
-
- branches/adium-1.2/Source/AIContactController.h (modified) (2 diffs)
- branches/adium-1.2/Source/AIContactController.m (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/adium-1.2/Source/AIContactController.h
r21622 r24151 49 49 //Status and Attribute updates 50 50 NSMutableSet *contactObservers; 51 NSMutableSet *removedContactObservers; 51 52 NSTimer *delayedUpdateTimer; 52 53 int delayedStatusChanges; … … 57 58 int delayedUpdateRequests; 58 59 BOOL updatesAreDelayed; 59 60 BOOL informingObservers; 61 60 62 //Sorting 61 63 NSMutableArray *sortControllerArray; branches/adium-1.2/Source/AIContactController.m
r23243 r24151 1446 1446 #endif 1447 1447 [contactObservers removeObject:[NSValue valueWithNonretainedObject:inObserver]]; 1448 1449 /* If we're in the middle of informing observers, we need to note this now-removed observer 1450 * so that we don't attempt to message it during this iteration. 1451 */ 1452 if (informingObservers) { 1453 if (!removedContactObservers) removedContactObservers = [[NSMutableSet alloc] init]; 1454 [removedContactObservers addObject:[NSValue valueWithNonretainedObject:inObserver]]; 1455 } 1448 1456 } 1449 1457 … … 1519 1527 NSValue *observerValue; 1520 1528 1529 informingObservers = YES; 1530 1521 1531 //Let our observers know 1522 enumerator = [ contactObserversobjectEnumerator];1532 enumerator = [[[contactObservers copy] autorelease] objectEnumerator]; 1523 1533 while ((observerValue = [enumerator nextObject])) { 1524 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];1525 1534 id <AIListObjectObserver> observer; 1526 1535 NSSet *newKeys; 1536 1537 /* Skip any observer which has been removed while we were iterating over observers, 1538 * as we don't retain observers and therefore risk messaging a released object. 1539 */ 1540 if (removedContactObservers && [removedContactObservers containsObject:observerValue]) 1541 continue; 1527 1542 1528 1543 observer = [observerValue nonretainedObjectValue]; … … 1537 1552 [attrChange unionSet:newKeys]; 1538 1553 } 1539 [pool release];1540 1554 } 1541 1555 … … 1545 1559 userInfo:(modifiedKeys ? [NSDictionary dictionaryWithObject:modifiedKeys 1546 1560 forKey:@"Keys"] : nil)]; 1547 1561 informingObservers = NO; 1562 1563 //If we removed any observers while informing them, we don't need that information any more 1564 if (removedContactObservers) { 1565 [removedContactObservers release]; removedContactObservers = nil; 1566 } 1567 1548 1568 return [attrChange autorelease]; 1549 1569 } … … 1552 1572 - (void)_updateAllAttributesOfObject:(AIListObject *)inObject 1553 1573 { 1554 NSEnumerator *enumerator = [ contactObserversobjectEnumerator];1574 NSEnumerator *enumerator = [[[contactObservers copy] autorelease] objectEnumerator]; 1555 1575 NSValue *observerValue; 1556 1557 while ((observerValue = [enumerator nextObject])) { 1576 1577 informingObservers = YES; 1578 1579 while ((observerValue = [enumerator nextObject])) { 1580 /* Skip any observer which has been removed while we were iterating over observers, 1581 * as we don't retain observers and therefore risk messaging a released object. 1582 */ 1583 if (removedContactObservers && [removedContactObservers containsObject:observerValue]) 1584 continue; 1585 1558 1586 id <AIListObjectObserver> observer = [observerValue nonretainedObjectValue]; 1559 1587 1560 1588 [observer updateListObject:inObject keys:nil silent:YES]; 1589 } 1590 1591 informingObservers = NO; 1592 1593 //If we removed any observers while informing them, we don't need that information any more 1594 if (removedContactObservers) { 1595 [removedContactObservers release]; removedContactObservers = nil; 1561 1596 } 1562 1597 }