Remove NSFastEnumeration for the Tokenizer and subclass the NSEnumerator instead
Memory management tends to be a bit complex in this case, especially under ARC, hence the change to prevent a headache
This commit is contained in:
@@ -17,14 +17,11 @@
|
||||
|
||||
@class HTMLParser;
|
||||
|
||||
@interface HTMLTokenizer : NSObject <NSFastEnumeration>
|
||||
@interface HTMLTokenizer : NSEnumerator
|
||||
|
||||
@property (nonatomic, assign) HTMLTokenizerState state;
|
||||
@property (nonatomic, weak, readonly) HTMLParser *parser;
|
||||
|
||||
- (instancetype)initWithString:(NSString *)string;
|
||||
|
||||
- (HTMLToken *)nextToken;
|
||||
- (NSArray *)allTokens;
|
||||
|
||||
@end
|
||||
|
||||
+3
-23
@@ -45,6 +45,7 @@
|
||||
|
||||
BOOL _eof;
|
||||
}
|
||||
@property (nonatomic, weak) HTMLParser *parser;
|
||||
@end
|
||||
|
||||
@implementation HTMLTokenizer
|
||||
@@ -82,7 +83,7 @@
|
||||
|
||||
#pragma mark - State Machine
|
||||
|
||||
- (HTMLToken *)nextToken
|
||||
- (id)nextObject
|
||||
{
|
||||
while (_eof == NO && _tokens.count == 0) {
|
||||
[self read];
|
||||
@@ -94,7 +95,7 @@
|
||||
return nextToken;
|
||||
}
|
||||
|
||||
- (NSArray *)allTokens
|
||||
- (NSArray *)allObjects
|
||||
{
|
||||
while (_eof == NO) {
|
||||
[self read];
|
||||
@@ -126,27 +127,6 @@
|
||||
[self switchToState:state];
|
||||
}
|
||||
|
||||
#pragma mark - Fast Enumeration
|
||||
|
||||
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id [])buffer count:(NSUInteger)len
|
||||
{
|
||||
if (state->state == 0) {
|
||||
state->mutationsPtr = &state->extra[0];
|
||||
state->state = 1;
|
||||
}
|
||||
|
||||
HTMLToken *nextToken = [self nextToken];
|
||||
|
||||
if (nextToken == nil) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
__unsafe_unretained const id *const_ptr = (__unsafe_unretained id *)(__bridge void *)nextToken;
|
||||
state->itemsPtr = (__typeof__(state->itemsPtr))const_ptr;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#pragma mark - Emits
|
||||
|
||||
- (void)emitToken:(HTMLToken *)token
|
||||
|
||||
@@ -57,7 +57,7 @@ static NSString * const TOKENIZER = @"tokenizer";
|
||||
tokenizer.state = [state integerValue];
|
||||
|
||||
NSArray *expectedTokens = test.output;
|
||||
NSArray *tokens = [tokenizer allTokens];
|
||||
NSArray *tokens = [tokenizer allObjects];
|
||||
XCTAssertEqualObjects(tokens, expectedTokens, @"%@", test.title);
|
||||
}
|
||||
}
|
||||
@@ -145,7 +145,7 @@ static NSString * const TOKENIZER = @"tokenizer";
|
||||
|
||||
id token = nil;
|
||||
do {
|
||||
token = [tokenizer nextToken];
|
||||
token = [tokenizer nextObject];
|
||||
} while (token != nil);
|
||||
}];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user