@@ -323,30 +323,52 @@ - (void)testRespondsToSelectorWorksEvenIfSwizzledProxyIsKVOd {
323
323
* swizzles a proxy object that we've also ISA Swizzled.
324
324
*/
325
325
- (void )testRespondsToSelectorWorksEvenIfSwizzledProxyISASwizzledBySomeoneElse {
326
- NSObject *object = [[NSObject alloc ] init ];
327
- GULProxy *proxyObject = [GULProxy proxyWithDelegate: object];
326
+ Class generatedClass = nil ;
327
+
328
+ @autoreleasepool {
329
+ NSObject *object = [[NSObject alloc ] init ];
330
+ GULProxy *proxyObject = [GULProxy proxyWithDelegate: object];
331
+
332
+ GULObjectSwizzler *swizzler = [[GULObjectSwizzler alloc ] initWithObject: proxyObject];
333
+ [swizzler copySelector: @selector (donorDescription )
334
+ fromClass: [GULObjectSwizzlerTest class ]
335
+ isClassSelector: NO ];
336
+ [swizzler swizzle ];
337
+
338
+ // Someone else ISA Swizzles the same object after GULObjectSwizzler.
339
+ Class originalClass = object_getClass (proxyObject);
340
+ NSString *newClassName = [NSString
341
+ stringWithFormat: @" gul_test_%p _%@ " , proxyObject, NSStringFromClass (originalClass)];
342
+ generatedClass = objc_allocateClassPair (originalClass, newClassName.UTF8String , 0 );
343
+ objc_registerClassPair (generatedClass);
344
+ object_setClass (proxyObject, generatedClass);
345
+
346
+ XCTAssertTrue ([proxyObject respondsToSelector: @selector (donorDescription )]);
347
+ XCTAssertEqual ([proxyObject performSelector: @selector (donorDescription )],
348
+ @" SwizzledDonorDescription" );
349
+ }
350
+
351
+ // A class generated by GULObjectSwizzler must not be disposed if there is its subclass.
352
+ XCTAssertNoThrow ([generatedClass description ]);
328
353
329
- GULObjectSwizzler *swizzler = [[GULObjectSwizzler alloc ] initWithObject: proxyObject];
330
- [swizzler copySelector: @selector (donorDescription )
331
- fromClass: [GULObjectSwizzlerTest class ]
332
- isClassSelector: NO ];
333
- [swizzler swizzle ];
354
+ // Clean up.
355
+ objc_disposeClassPair (generatedClass);
356
+ }
334
357
335
- // Someone else ISA Swizzles the same object after GULObjectSwizzler.
336
- Class originalClass = object_getClass (proxyObject);
337
- NSString *newClassName =
338
- [NSString stringWithFormat: @" gul_test_%p _%@ " , proxyObject, NSStringFromClass (originalClass)];
339
- Class generatedClass = objc_allocateClassPair (originalClass, newClassName.UTF8String , 0 );
340
- objc_registerClassPair (generatedClass);
341
- object_setClass (proxyObject, generatedClass);
358
+ - (void )testMultiSwizzling {
359
+ NSObject *object = [[NSObject alloc ] init ];
342
360
343
- XCTAssertTrue ([proxyObject respondsToSelector: @selector (donorDescription )]);
344
- XCTAssertEqual ([proxyObject performSelector: @selector (donorDescription )],
345
- @" SwizzledDonorDescription" );
361
+ NSInteger swizzleCount = 10 ;
362
+ for (NSInteger i = 0 ; i < swizzleCount; i++) {
363
+ GULObjectSwizzler *swizzler = [[GULObjectSwizzler alloc ] initWithObject: object];
364
+ [swizzler copySelector: @selector (donorDescription )
365
+ fromClass: [GULObjectSwizzlerTest class ]
366
+ isClassSelector: NO ];
367
+ [swizzler swizzle ];
368
+ }
346
369
347
- // Clean up.
348
- object_setClass (proxyObject, originalClass);
349
- objc_disposeClassPair (generatedClass);
370
+ XCTAssertNoThrow ([object performSelector: @selector (donorDescription )]);
371
+ object = nil ;
350
372
}
351
373
352
374
@end
0 commit comments