From f32c6c12364edc2f95e5fee0bdec6aecfe15e646 Mon Sep 17 00:00:00 2001 From: Aleksey Garbarev Date: Wed, 29 Jan 2014 06:17:33 +0700 Subject: [PATCH] Working on reference-counting problems with ARC when building instance --- .../TyphoonInitializer+InstanceBuilder.h | 2 + .../TyphoonInitializer+InstanceBuilder.m | 13 ++ ...phoonParameterInjectedWithObjectInstance.h | 2 +- ...phoonParameterInjectedWithObjectInstance.m | 10 +- ...arameterInjectedWithStringRepresentation.h | 3 + ...arameterInjectedWithStringRepresentation.m | 18 ++ .../TyphoonComponentFactory+InstanceBuilder.h | 4 +- .../TyphoonComponentFactory+InstanceBuilder.m | 195 ++++++++++++------ Source/Factory/TyphoonComponentFactory.m | 32 ++- Source/Utils/NSObject+PropertyInjection.m | 3 - ...ComponentDefinition+InstanceBuilderTests.m | 8 +- Tests/Factory/TyphoonComponentFactoryTests.m | 18 +- 12 files changed, 217 insertions(+), 91 deletions(-) diff --git a/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.h b/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.h index 853d087bf..3e0d9d6c8 100644 --- a/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.h +++ b/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.h @@ -21,6 +21,8 @@ - (NSInvocation*)asInvocationFor:(id)classOrInstance; +- (NSMethodSignature *) methodSignatureForClass:(Class)clazz; + - (void)setComponentDefinition:(TyphoonDefinition*)definition; diff --git a/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.m b/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.m index 037ad0e6e..9a26c7b26 100644 --- a/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.m +++ b/Source/Definition/Initializer/Internal/TyphoonInitializer+InstanceBuilder.m @@ -60,6 +60,19 @@ - (NSInvocation*)asInvocationFor:(id)classOrInstance return invocation; } +- (NSMethodSignature *) methodSignatureForClass:(Class)clazz +{ + NSMethodSignature *signature = nil; + + if (self.isClassMethod) { + signature = [clazz methodSignatureForSelector:_selector]; + } else { + signature = [clazz instanceMethodSignatureForSelector:_selector]; + } + + return signature; +} + - (void)setComponentDefinition:(TyphoonDefinition*)definition { diff --git a/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.h b/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.h index 8c5e99fc2..68d437c5c 100644 --- a/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.h +++ b/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.h @@ -23,6 +23,6 @@ - (id)initWithParameterIndex:(NSUInteger)index value:(id)value; -- (BOOL) isPrimitiveParameterFor:(id)classOrInstance; +- (BOOL) isPrimitiveParameterForClass:(Class)aClass isClassMethod:(BOOL)isClassMethod; @end diff --git a/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.m b/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.m index 876031abc..e98796950 100644 --- a/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.m +++ b/Source/Definition/Initializer/TyphoonParameterInjectedWithObjectInstance.m @@ -42,13 +42,9 @@ - (void)setInitializer:(TyphoonInitializer*)initializer /* ====================================================================================================================================== */ #pragma mark - Interface Methods -- (BOOL) isPrimitiveParameterFor:(id)classOrInstance -{ - BOOL isClass = class_isMetaClass(object_getClass(classOrInstance)); - - Class class = isClass ? classOrInstance : [classOrInstance class]; - - NSArray* typeCodes = [TyphoonIntrospectionUtils typeCodesForSelector:_initializer.selector ofClass:class isClassMethod:isClass]; +- (BOOL) isPrimitiveParameterForClass:(Class)aClass isClassMethod:(BOOL)isClassMethod +{ + NSArray* typeCodes = [TyphoonIntrospectionUtils typeCodesForSelector:_initializer.selector ofClass:aClass isClassMethod:isClassMethod]; return ![[typeCodes objectAtIndex:_index] isEqualToString:@"@"]; } diff --git a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h index 0d9260fee..a07465ac6 100644 --- a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h +++ b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h @@ -43,4 +43,7 @@ */ - (TyphoonTypeDescriptor*)resolveTypeWith:(id)classOrInstance; +- (TyphoonTypeDescriptor*)resolveTypeWith:(Class)clazz isClassMethod:(BOOL)isClassMethod; + + @end diff --git a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m index 04c5be320..1351539f0 100644 --- a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m +++ b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m @@ -69,6 +69,24 @@ - (TyphoonTypeDescriptor*)resolveTypeWith:(id)classOrInstance } } +- (TyphoonTypeDescriptor*)resolveTypeWith:(Class)clazz isClassMethod:(BOOL)isClassMethod +{ + if (_requiredType) + { + return [TyphoonTypeDescriptor descriptorWithClassOrProtocol:_requiredType]; + } + else + { + NSArray* typeCodes = [TyphoonIntrospectionUtils typeCodesForSelector:_initializer.selector ofClass:clazz isClassMethod:isClassMethod]; + + if ([[typeCodes objectAtIndex:_index] isEqualToString:@"@"]) + { + [NSException raise:NSInvalidArgumentException + format:@"Unless the type is primitive (int, BOOL, etc), initializer injection requires the required class to be specified. Eg: "]; + } + return [TyphoonTypeDescriptor descriptorWithTypeCode:[typeCodes objectAtIndex:_index]]; + } +} /* ====================================================================================================================================== */ #pragma mark - Protocol Methods diff --git a/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.h b/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.h index 2891910ed..9d850588d 100644 --- a/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.h +++ b/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.h @@ -21,9 +21,9 @@ */ @interface TyphoonComponentFactory (InstanceBuilder) -- (id)buildInstanceWithDefinition:(TyphoonDefinition*)definition; +- (id)newInstanceWithDefinition:(TyphoonDefinition*)definition; -- (id)buildSharedInstanceForDefinition:(TyphoonDefinition*)definition; +- (id)newSharedInstanceForDefinition:(TyphoonDefinition*)definition; - (void)injectPropertyDependenciesOn:(__autoreleasing id)instance withDefinition:(TyphoonDefinition*)definition; diff --git a/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m b/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m index 0f2086cfd..49dfd92e4 100644 --- a/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m +++ b/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m @@ -53,17 +53,21 @@ @implementation TyphoonComponentFactory (InstanceBuilder) /* ====================================================================================================================================== */ #pragma mark - Initialization & Destruction -- (id)buildInstanceWithDefinition:(TyphoonDefinition*)definition +- (id)newInstanceWithDefinition:(TyphoonDefinition*)definition { - __autoreleasing id instance = [self allocateInstanceWithDefinition:definition]; + id instance = nil; + + instance = [self newInitializedInstanceWithDefinition:definition]; [_stack push:[TyphoonStackElement itemWithKey:definition.key instance:instance]]; - instance = [self injectInstance:instance withDefinition:definition]; - instance = [self postProcessInstance:instance]; + [self injectPropertyDependenciesOn:instance withDefinition:definition]; [_stack pop]; + + instance = [self postProcessInstance:instance]; + return instance; } -- (id)allocateInstanceWithDefinition:(TyphoonDefinition*)definition +- (id) newInitializedInstanceWithDefinition:(TyphoonDefinition*)definition NS_RETURNS_RETAINED { id instance = nil; @@ -73,32 +77,38 @@ - (id)allocateInstanceWithDefinition:(TyphoonDefinition*)definition // about. instance = [self componentForKey:definition.factoryReference]; // clears currently resolving. } - else if (definition.initializer && definition.initializer.isClassMethod) - { - // this is an instance of the class, needing no more init. - instance = [self invokeInitializer:definition.initializer on:definition.type]; - } else { - // this is an instance, needing later init. - /* FIXME: sending init on another line than alloc is wrong, see apple docs */ - instance = [definition.type alloc]; + /* Sending init later after alloc is wrong, see http://www.foldr.org/~michaelw/objective-c/ObjectiveC/5RunTime/Allocation__tialization.html + * It is reason to refactor */ + + NSInvocation *invocation = [self invocationToInitDefinition:definition]; + + if (definition.initializer && definition.initializer.isClassMethod) { + [invocation setTarget:definition.type]; + } else { + [invocation setTarget:[definition.type alloc]]; + } + + [invocation invoke]; + [invocation getReturnValue:&instance]; } + + [self handleSpecialCaseForNSManagedObjectModel:instance]; return instance; } - -- (id)injectInstance:(id)instance withDefinition:(TyphoonDefinition*)definition -{ - instance = [self initializerInjectionOn:instance withDefinition:definition]; - [_stack push:[TyphoonStackElement itemWithKey:definition.key instance:instance]]; - [self injectPropertyDependenciesOn:instance withDefinition:definition]; - [_stack pop]; - return instance; -} +//- (id)injectInstance:(id)instance withDefinition:(TyphoonDefinition*)definition UNAVAILABLE_ATTRIBUTE +//{ +// instance = [self initializerInjectionOn:instance withDefinition:definition]; +// [_stack push:[TyphoonStackElement itemWithKey:definition.key instance:instance]]; +// [self injectPropertyDependenciesOn:instance withDefinition:definition]; +// [_stack pop]; +// return instance; +//} - (id)postProcessInstance:(id)instance { @@ -112,26 +122,26 @@ - (id)postProcessInstance:(id)instance return instance; } -- (id)initializerInjectionOn:(id)instance withDefinition:(TyphoonDefinition*)definition -{ - if (definition.initializer) - { - if (definition.initializer.isClassMethod == NO) - { - instance = [self invokeInitializer:definition.initializer on:instance]; - } - else - { - // initializer was already invoked in allocateInstance:withDefinition: - } - } - else if (definition.initializer == nil) - { - instance = [self invokeDefaultInitializerOn:instance]; - } - - return instance; -} +//- (id)initializerInjectionOn:(id)instance withDefinition:(TyphoonDefinition*)definition UNAVAILABLE_ATTRIBUTE +//{ +// if (definition.initializer) +// { +// if (definition.initializer.isClassMethod == NO) +// { +// instance = [self invokeInitializer:definition.initializer on:instance]; +// } +// else +// { +// // initializer was already invoked in allocateInstance:withDefinition: +// } +// } +// else if (definition.initializer == nil) +// { +// instance = [self invokeDefaultInitializerOn:instance]; +// } +// +// return instance; +//} - (id)invokeDefaultInitializerOn:(id)instance { @@ -152,13 +162,13 @@ - (void)injectAssemblyOnInstance:(id )instance; [instance setFactory:self]; } -- (id)buildSharedInstanceForDefinition:(TyphoonDefinition*)definition +- (id)newSharedInstanceForDefinition:(TyphoonDefinition*)definition { if ([self alreadyResolvingKey:definition.key]) { return [_stack peekForKey:definition.key].instance; } - return [self buildInstanceWithDefinition:definition]; + return [self newInstanceWithDefinition:definition]; } @@ -170,7 +180,7 @@ - (BOOL)alreadyResolvingKey:(NSString*)key /* ====================================================================================================================================== */ #pragma mark - Property Injection -- (void)injectPropertyDependenciesOn:(__autoreleasing id)instance withDefinition:(TyphoonDefinition*)definition +- (void)injectPropertyDependenciesOn:(id)instance withDefinition:(TyphoonDefinition*)definition { [self doBeforePropertyInjectionOn:instance withDefinition:definition]; @@ -279,7 +289,7 @@ - (BOOL)propertyIsCircular:(TyphoonAbstractInjectedProperty*)property onInstance return [[instance circularDependentProperties] objectForKey:property.name] != nil; } -- (void)injectCircularDependenciesOn:(__autoreleasing id )instance +- (void)injectCircularDependenciesOn:(id )instance { NSMutableDictionary* circularDependentProperties = [instance circularDependentProperties]; for (NSString* propertyName in [circularDependentProperties allKeys]) @@ -312,12 +322,40 @@ - (void)doAfterPropertyInjectionOn:(id )instance w /* ====================================================================================================================================== */ #pragma mark - Private Methods -- (id)invokeInitializer:(TyphoonInitializer*)initializer on:(id)instanceOrClass +- (NSInvocation *) invocationToInitDefinition:(TyphoonDefinition *)definition { - NSInvocation* invocation = [initializer asInvocationFor:instanceOrClass]; + NSInvocation *invocation = nil; + + if (definition.initializer) { + invocation = [self invocationForInitializer:definition.initializer withClass:definition.type]; + } else { + invocation = [self defaultInitInvocation]; + } + + return invocation; +} - NSArray* injectedParameters = [initializer injectedParameters]; - for (id parameter in injectedParameters) +- (NSInvocation *) defaultInitInvocation +{ + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[NSObject instanceMethodSignatureForSelector:@selector(init)]]; + [invocation setSelector:@selector(init)]; + return invocation; +} + +- (NSInvocation *) invocationForInitializer:(TyphoonInitializer *)initializer withClass:(Class)class +{ + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[initializer methodSignatureForClass:class]]; + + [self configureInvocation:invocation forClass:class withParametersFromInitializer:initializer]; + + [invocation setSelector:initializer.selector]; + + return invocation; +} + +- (void) configureInvocation:(NSInvocation *)invocation forClass:(Class)clazz withParametersFromInitializer:(TyphoonInitializer *)initializer +{ + for (id parameter in [initializer injectedParameters]) { if (parameter.type == TyphoonParameterInjectionTypeReference) { @@ -328,16 +366,17 @@ - (id)invokeInitializer:(TyphoonInitializer*)initializer on:(id)instanceOrClass else if (parameter.type == TyphoonParameterInjectionTypeStringRepresentation) { TyphoonParameterInjectedWithStringRepresentation* byValue = (TyphoonParameterInjectedWithStringRepresentation*)parameter; - [self setArgumentFor:invocation index:byValue.index + 2 textValue:byValue.textValue - requiredType:[byValue resolveTypeWith:instanceOrClass]]; + TyphoonTypeDescriptor *type = [byValue resolveTypeWith:clazz isClassMethod:initializer.isClassMethod]; + + [self setArgumentFor:invocation index:byValue.index + 2 textValue:byValue.textValue requiredType:type]; } else if (parameter.type == TyphoonParameterInjectionTypeObjectInstance) { TyphoonParameterInjectedWithObjectInstance* byInstance = (TyphoonParameterInjectedWithObjectInstance*)parameter; id value = byInstance.value; BOOL isValuesIsWrapper = [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSValue class]]; - - if (isValuesIsWrapper && [byInstance isPrimitiveParameterFor:instanceOrClass]) { + + if (isValuesIsWrapper && [byInstance isPrimitiveParameterForClass:clazz isClassMethod:initializer.isClassMethod]) { [self setPrimitiveArgumentForInvocation:invocation index:parameter.index + 2 fromValue:value]; } else { [invocation setArgument:&value atIndex:parameter.index + 2]; @@ -350,12 +389,52 @@ - (id)invokeInitializer:(TyphoonInitializer*)initializer on:(id)instanceOrClass [invocation setArgument:&collection atIndex:parameter.index + 2]; } } - [invocation invoke]; - __autoreleasing id returnValue = nil; - [invocation getReturnValue:&returnValue]; - return returnValue; } +//- (id)invokeInitializer:(TyphoonInitializer*)initializer on:(id)instanceOrClass UNAVAILABLE_ATTRIBUTE +//{ +// NSInvocation* invocation = [initializer asInvocationFor:instanceOrClass]; +// +// NSArray* injectedParameters = [initializer injectedParameters]; +// for (id parameter in injectedParameters) +// { +// if (parameter.type == TyphoonParameterInjectionTypeReference) +// { +// TyphoonParameterInjectedByReference* byReference = (TyphoonParameterInjectedByReference*)parameter; +// id reference = [self componentForKey:byReference.reference]; +// [invocation setArgument:&reference atIndex:parameter.index + 2]; +// } +// else if (parameter.type == TyphoonParameterInjectionTypeStringRepresentation) +// { +// TyphoonParameterInjectedWithStringRepresentation* byValue = (TyphoonParameterInjectedWithStringRepresentation*)parameter; +// [self setArgumentFor:invocation index:byValue.index + 2 textValue:byValue.textValue +// requiredType:[byValue resolveTypeWith:instanceOrClass]]; +// } +// else if (parameter.type == TyphoonParameterInjectionTypeObjectInstance) +// { +// TyphoonParameterInjectedWithObjectInstance* byInstance = (TyphoonParameterInjectedWithObjectInstance*)parameter; +// id value = byInstance.value; +// BOOL isValuesIsWrapper = [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSValue class]]; +// +// if (isValuesIsWrapper && [byInstance isPrimitiveParameterFor:instanceOrClass]) { +// [self setPrimitiveArgumentForInvocation:invocation index:parameter.index + 2 fromValue:value]; +// } else { +// [invocation setArgument:&value atIndex:parameter.index + 2]; +// } +// } +// else if (parameter.type == TyphoonParameterInjectionTypeAsCollection) +// { +// TyphoonParameterInjectedAsCollection* asCollection = (TyphoonParameterInjectedAsCollection*)parameter; +// id collection = [self buildCollectionWithValues:asCollection.values requiredType:asCollection.collectionType]; +// [invocation setArgument:&collection atIndex:parameter.index + 2]; +// } +// } +// [invocation invoke]; +// __autoreleasing id returnValue = nil; +// [invocation getReturnValue:&returnValue]; +// return returnValue; +//} + /* ====================================================================================================================================== */ diff --git a/Source/Factory/TyphoonComponentFactory.m b/Source/Factory/TyphoonComponentFactory.m index 928012cd0..4849cd0e2 100644 --- a/Source/Factory/TyphoonComponentFactory.m +++ b/Source/Factory/TyphoonComponentFactory.m @@ -279,7 +279,7 @@ - (void)instantiateEagerSingletons }]; } -- (id)instanceForDefinition:(TyphoonDefinition*)definition fromPool:(id)pool buildBlock:(TyphoonInstanceBuildBlock)buildBlock +- (id)instanceForDefinition:(TyphoonDefinition*)definition fromPool:(id)pool buildBlock:(TyphoonInstanceBuildBlock)buildBlock NS_RETURNS_RETAINED { NSParameterAssert(buildBlock); @synchronized (self) @@ -288,23 +288,39 @@ - (id)instanceForDefinition:(TyphoonDefinition*)definition fromPool:(id",instance); [pool setObject:instance forKey:definition.key]; + NSLog(@"2. instance = <%@>",instance); } + NSLog(@"3. instance = <%@>",instance); return instance; } } -- (id) sharedObjectGraphInstanceForDefinition:(TyphoonDefinition*)definition fromPool:(id)pool +- (id) sharedObjectGraphInstanceForDefinition:(TyphoonDefinition*)definition fromPool:(id)pool NS_RETURNS_RETAINED { - return [self instanceForDefinition:definition fromPool:pool buildBlock:^id(TyphoonDefinition *definition) { - return [self buildSharedInstanceForDefinition:definition]; - }]; + @synchronized (self) + { + id instance = [pool objectForKey:definition.key]; + if (instance == nil) + { + @autoreleasepool { + instance = [self newSharedInstanceForDefinition:definition]; + } + + NSLog(@"1. instance = <%@> (%d)",instance, (int)[instance performSelector:NSSelectorFromString(@"retainCount")]); + [pool setObject:instance forKey:definition.key]; + NSLog(@"2. instance = <%@> (%d)",instance, (int)[instance performSelector:NSSelectorFromString(@"retainCount")]); + } + NSLog(@"3. instance = <%@> (%d)",instance, (int)[instance performSelector:NSSelectorFromString(@"retainCount")]); + return instance; + } } -- (id) sharedInstanceForDefinition:(TyphoonDefinition*)definition fromPool:(id)pool +- (id) sharedInstanceForDefinition:(TyphoonDefinition*)definition fromPool:(id)pool NS_RETURNS_RETAINED { return [self instanceForDefinition:definition fromPool:pool buildBlock:^id(TyphoonDefinition *definition) { - return [self buildInstanceWithDefinition:definition]; + return [self newInstanceWithDefinition:definition]; }]; } @@ -346,7 +362,7 @@ - (id)objectForDefinition:(TyphoonDefinition*)definition break; default: case TyphoonScopePrototype: - instance = [self buildInstanceWithDefinition:definition]; + instance = [self newInstanceWithDefinition:definition]; break; } diff --git a/Source/Utils/NSObject+PropertyInjection.m b/Source/Utils/NSObject+PropertyInjection.m index a2e62dacc..35123d25f 100644 --- a/Source/Utils/NSObject+PropertyInjection.m +++ b/Source/Utils/NSObject+PropertyInjection.m @@ -36,9 +36,6 @@ - (void) injectValue:(id)value forPropertyName:(NSString *)propertyName withType [self injectValue:value asPointerForPropertyName:propertyName]; } else { [self setValue:value forKey:propertyName]; -#if !__has_feature(objc_arc) -#error Arc feature required! -#endif } } diff --git a/Tests/Factory/Internal/TyphoonComponentDefinition+InstanceBuilderTests.m b/Tests/Factory/Internal/TyphoonComponentDefinition+InstanceBuilderTests.m index f0208a911..99a7f71b9 100644 --- a/Tests/Factory/Internal/TyphoonComponentDefinition+InstanceBuilderTests.m +++ b/Tests/Factory/Internal/TyphoonComponentDefinition+InstanceBuilderTests.m @@ -45,7 +45,7 @@ - (void)test_injects_required_initializer_dependencies TyphoonDefinition* questDefinition = [[TyphoonDefinition alloc] initWithClass:[CampaignQuest class] key:@"quest"]; [_componentFactory register:questDefinition]; - Knight* knight = [_componentFactory buildInstanceWithDefinition:knightDefinition]; + Knight* knight = [_componentFactory newInstanceWithDefinition:knightDefinition]; assertThat(knight, notNilValue()); assertThat(knight.quest, notNilValue()); } @@ -59,7 +59,7 @@ - (void)test_injects_required_initializer_dependencies_with_factory_method [urlDefinition setInitializer:initializer]; [_componentFactory register:urlDefinition]; - NSURL* url = [_componentFactory buildInstanceWithDefinition:urlDefinition]; + NSURL* url = [_componentFactory newInstanceWithDefinition:urlDefinition]; assertThat(url, notNilValue()); } @@ -196,7 +196,7 @@ - (void)test_injects_required_property_dependencies TyphoonDefinition* questDefinition = [[TyphoonDefinition alloc] initWithClass:[CampaignQuest class] key:@"quest"]; [_componentFactory register:questDefinition]; - Knight* knight = [_componentFactory buildInstanceWithDefinition:knightDefinition]; + Knight* knight = [_componentFactory newInstanceWithDefinition:knightDefinition]; assertThat(knight, notNilValue()); assertThat(knight.quest, notNilValue()); } @@ -212,7 +212,7 @@ - (void)test_raises_exception_if_property_setter_does_not_exist @try { - Knight* knight = [_componentFactory buildInstanceWithDefinition:knightDefinition]; + Knight* knight = [_componentFactory newInstanceWithDefinition:knightDefinition]; STFail(@"Should have thrown exception"); knight = nil; } diff --git a/Tests/Factory/TyphoonComponentFactoryTests.m b/Tests/Factory/TyphoonComponentFactoryTests.m index f03b620b8..70c9fe2a6 100644 --- a/Tests/Factory/TyphoonComponentFactoryTests.m +++ b/Tests/Factory/TyphoonComponentFactoryTests.m @@ -363,20 +363,22 @@ - (void)test_load_weakSingleton { TyphoonComponentFactory *localFactory = [[TyphoonComponentFactory alloc] init]; NSString *key = @"WeakSingleton"; - [localFactory register:[TyphoonDefinition withClass:[NSMutableString class] properties:^(TyphoonDefinition* definition) - { - [definition setKey:key]; - [definition setScope:TyphoonScopeWeakSingleton]; - }]]; + [localFactory register:[TyphoonDefinition withClass:[NSMutableString class] initialization:^(TyphoonInitializer *initializer) { + [initializer setSelector:@selector(new)]; + } properties:^(TyphoonDefinition* definition) { + [definition setKey:key]; + [definition setScope:TyphoonScopeWeakSingleton]; + }]]; + [localFactory load]; NSMutableString *requestedString, *requestedString2; @autoreleasepool { requestedString = [localFactory componentForKey:key]; -// requestedString2 = [localFactory componentForKey:key]; -// assertThat(requestedString, equalTo(requestedString2)); -// [requestedString setString:@"Text!"]; + requestedString2 = [localFactory componentForKey:key]; + assertThat(requestedString, equalTo(requestedString2)); + [requestedString setString:@"Text!"]; } __weak NSMutableString *weakString = requestedString2;