Skip to content

Commit

Permalink
Replace adviseMethods class method with instance method.
Browse files Browse the repository at this point in the history
rhgills committed Dec 15, 2013
1 parent 7277443 commit e62b01b
Showing 4 changed files with 15 additions and 36 deletions.
3 changes: 1 addition & 2 deletions Source/Factory/Block/TyphoonAssembly.m
Original file line number Diff line number Diff line change
@@ -175,8 +175,7 @@ - (void)prepareForUse
{
self.definitionSelectors = [self.adviser enumerateDefinitionSelectors];

// [self.adviser adviseAssembly];
[TyphoonAssemblyAdviser adviseMethods:self];
[self.adviser adviseAssembly];
}

@end
1 change: 0 additions & 1 deletion Source/Factory/Block/TyphoonAssemblyAdviser.h
Original file line number Diff line number Diff line change
@@ -19,7 +19,6 @@

@interface TyphoonAssemblyAdviser : NSObject

+ (void)adviseMethods:(TyphoonAssembly*)assembly;
+ (void)undoAdviseMethods:(TyphoonAssembly*)assembly;
+ (BOOL)assemblyClassIsAdvised:(Class)class;

28 changes: 4 additions & 24 deletions Source/Factory/Block/TyphoonAssemblyAdviser.m
Original file line number Diff line number Diff line change
@@ -66,7 +66,7 @@ - (void)adviseAssembly
- (void)swizzleAssemblyMethods
{
NSSet* definitionSelectors = [self enumerateDefinitionSelectors];
LogTrace(@"About to swizzle the following definition selectors: %@.", definitionSelectors);
NSLog(@"About to swizzle the following definition selectors: %@.", definitionSelectors);

[self swizzleDefinitionSelectors:definitionSelectors];

@@ -95,17 +95,6 @@ - (void)swapImplementationOfDefinitionSelectorWithAdvisedImplementation:(Typhoon
}
}

+ (void)adviseMethods:(TyphoonAssembly*)assembly
{
@synchronized (self)
{
if ([TyphoonAssemblyAdviser assemblyIsNotAdvised:assembly])
{
[self swizzleAssemblyMethods:assembly];
}
}
}

+ (void)undoAdviseMethods:(TyphoonAssembly*)assembly
{
@synchronized (self)
@@ -121,24 +110,13 @@ + (void)unswizzleAssemblyMethods:(TyphoonAssembly*)assembly
{
NSSet *swizzledSelectors = [swizzledDefinitionsByAssemblyClass objectForKey:[assembly class]];

LogTrace(@"Unswizzling the following selectors: '%@' on assembly: '%@'.", swizzledSelectors, assembly);
NSLog(@"Unswizzling the following selectors: '%@' on assembly: '%@'.", swizzledSelectors, assembly);

[self swizzleDefinitionSelectors:swizzledSelectors onAssembly:assembly];

[self markAssemblyMethodsAsNoLongerAdvised:assembly];
}

+ (void)swizzleAssemblyMethods:(TyphoonAssembly*)assembly
{
TyphoonAssemblyAdviser* adviser = [[TyphoonAssemblyAdviser alloc] initWithAssembly:assembly];
NSSet* definitionSelectors = [adviser enumerateDefinitionSelectors];
LogTrace(@"About to swizzle the following definition selectors: %@.", definitionSelectors);

[self swizzleDefinitionSelectors:definitionSelectors onAssembly:assembly];

[self markAssemblyMethods:definitionSelectors asAdvised:assembly];
}

+ (void)swizzleDefinitionSelectors:(NSSet*)definitionSelectors onAssembly:(TyphoonAssembly*)assembly
{
[definitionSelectors enumerateObjectsUsingBlock:^(NSValue *selectorObj, BOOL* stop)
@@ -256,6 +234,8 @@ + (BOOL)assemblyIsAdvised:(TyphoonAssembly*)assembly

+ (BOOL)assemblyClassIsAdvised:(Class)class
{
NSLog(@"Checking if assemby class is advised: '%@'.", NSStringFromClass(class));

return [[swizzledDefinitionsByAssemblyClass allKeys] containsObject:class];
}

Original file line number Diff line number Diff line change
@@ -43,14 +43,15 @@ - (void)test_allows_initialization_with_a_collection_of_assemblies_in_any_order
[CollaboratingMiddleAgesAssembly verifyKnightWithExternalQuest:knight];
}

- (void)test_dealloc_cleans_up_method_advising
{
MiddleAgesAssembly* assembly = [MiddleAgesAssembly assembly];
TyphoonComponentFactory* factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[assembly]];
factory = nil;
assembly = nil;

STAssertFalse([TyphoonAssemblyAdviser assemblyClassIsAdvised:[MiddleAgesAssembly class]], nil);
}
// Can't accurately test this here because with ARC we can't control whether the factory and assembly are deallocated before or after we check!
//- (void)test_dealloc_cleans_up_method_advising
//{
// MiddleAgesAssembly* assembly = [MiddleAgesAssembly assembly];
// TyphoonComponentFactory* factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[assembly]];
// factory = nil;
// assembly = nil;
//
// STAssertFalse([TyphoonAssemblyAdviser assemblyClassIsAdvised:[MiddleAgesAssembly class]], nil);
//}

@end

0 comments on commit e62b01b

Please sign in to comment.