From de15dba1ee06bb373d01431f43c96ee92f989a7e Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Sun, 30 Sep 2012 18:36:37 +0100 Subject: [PATCH] Converted to ARC. Merged, and more fixes added, by Jens. --- Demo-Mac/DemoAppController.m | 27 ++- Demo-Mac/DemoQuery.m | 6 +- Demo-Mac/ShoppingItem.m | 9 +- Demo-iOS/EmptyAppDelegate.m | 4 +- Listener/TDHTTPConnection.m | 5 +- Listener/TDHTTPResponse.m | 16 +- Listener/TDListener.m | 8 +- Source/ChangeTracker/TDChangeTracker.h | 10 +- Source/ChangeTracker/TDChangeTracker.m | 13 +- .../ChangeTracker/TDConnectionChangeTracker.m | 11 +- Source/ChangeTracker/TDSocketChangeTracker.m | 41 ++--- Source/TDAttachment.m | 6 - Source/TDAuthorizer.h | 4 +- Source/TDAuthorizer.m | 31 +--- Source/TDBase64.m | 4 +- Source/TDBatcher.m | 9 +- Source/TDBlobStore.m | 16 +- Source/TDBlobStore_Tests.m | 4 +- Source/TDBody.m | 12 +- Source/TDCanonicalJSON.m | 13 +- Source/TDChangeTracker_Tests.m | 41 +++-- Source/TDCollateJSON.m | 2 - Source/TDDatabase+Attachments.m | 25 ++- Source/TDDatabase+Insertion.m | 25 +-- Source/TDDatabase+LocalDocs.m | 4 +- Source/TDDatabase+Replication.m | 1 - Source/TDDatabase.m | 47 +++-- Source/TDDatabaseManager.m | 13 +- Source/TDDatabase_Tests.m | 63 ++++--- Source/TDJSON.m | 9 +- Source/TDMisc.m | 42 +++-- Source/TDMultiStreamWriter.h | 2 +- Source/TDMultiStreamWriter.m | 37 ++-- Source/TDMultipartDocumentReader.m | 28 +-- Source/TDMultipartDownloader.m | 8 +- Source/TDMultipartReader.m | 36 +--- Source/TDMultipartUploader.m | 6 +- Source/TDMultipartWriter.m | 16 +- Source/TDOAuth1Authorizer.m | 24 +-- Source/TDPuller.m | 76 ++++---- Source/TDPusher.m | 14 +- Source/TDReachability.m | 19 +- Source/TDReachability_Stubs.m | 82 --------- Source/TDRemoteRequest.h | 2 +- Source/TDRemoteRequest.m | 37 ++-- Source/TDReplicator.h | 8 +- Source/TDReplicator.m | 69 ++++---- Source/TDReplicatorManager.m | 14 +- Source/TDReplicator_Tests.m | 14 +- Source/TDRevision.h | 2 +- Source/TDRevision.m | 18 +- Source/TDRouter+Handlers.m | 20 +-- Source/TDRouter.h | 4 +- Source/TDRouter.m | 50 ++---- Source/TDRouter_Tests.m | 11 +- Source/TDSequenceMap.m | 8 +- Source/TDServer.m | 34 ++-- Source/TDStatus.m | 34 ++-- Source/TDURLProtocol.m | 36 ++-- Source/TDView.h | 2 +- Source/TDView.m | 23 +-- Source/TDView_Tests.m | 19 +- TouchDB.xcodeproj/project.pbxproj | 162 +++++++++--------- vendor/MYUtilities | 2 +- 64 files changed, 559 insertions(+), 879 deletions(-) delete mode 100644 Source/TDReachability_Stubs.m diff --git a/Demo-Mac/DemoAppController.m b/Demo-Mac/DemoAppController.m index f2c9b9f..ff1a093 100644 --- a/Demo-Mac/DemoAppController.m +++ b/Demo-Mac/DemoAppController.m @@ -59,7 +59,7 @@ - (void) applicationDidFinishLaunching: (NSNotification*)n { CouchTouchDBServer* server = [CouchTouchDBServer sharedInstance]; NSAssert(!server.error, @"Error initializing TouchDB: %@", server.error); - _database = [[server databaseNamed: dbName] retain]; + _database = [server databaseNamed: dbName]; RESTOperation* op = [_database create]; if (![op wait]) { @@ -94,7 +94,7 @@ - (void) applicationDidFinishLaunching: (NSNotification*)n { CouchQuery* q = [design queryViewNamed: @"byDate"]; q.descending = YES; - self.query = [[[DemoQuery alloc] initWithQuery: q] autorelease]; + self.query = [[DemoQuery alloc] initWithQuery: q]; self.query.modelClass =_tableController.objectClass; // Start watching any persistent replications already configured: @@ -220,22 +220,15 @@ - (void) stopObservingReplication: (CouchPersistentReplication*)repl { [repl removeObserver: self forKeyPath: @"mode"]; } -- (void) forgetReplication: (CouchPersistentReplication**)repl { - if (*repl) { - [self stopObservingReplication: *repl]; - [*repl release]; - *repl = nil; - } -} - - (void) startContinuousSyncWith: (NSURL*)otherDbURL { - [self forgetReplication: &_pull]; - [self forgetReplication: &_push]; - + if (_pull) + [self stopObservingReplication: _pull]; + if (_push) + [self stopObservingReplication: _push]; NSArray* repls = [_database replicateWithURL: otherDbURL exclusively: YES]; - _pull = [repls[0] retain]; - _push = [repls[1] retain]; + _pull = repls[0]; + _push = repls[1]; [self observeReplication: _pull]; [self observeReplication: _push]; @@ -341,7 +334,7 @@ - (TDMapBlock) compileMapFunction: (NSString*)mapSource language:(NSString *)lan emit(doc[@"foo"], nil); }; } - return [[mapBlock copy] autorelease]; + return [mapBlock copy]; } @@ -354,7 +347,7 @@ - (TDReduceBlock) compileReduceFunction: (NSString*)reduceSource language:(NSStr return [TDView totalValues: values]; }; } - return [[reduceBlock copy] autorelease]; + return [reduceBlock copy]; } #endif diff --git a/Demo-Mac/DemoQuery.m b/Demo-Mac/DemoQuery.m index 45c9f23..82b0615 100644 --- a/Demo-Mac/DemoQuery.m +++ b/Demo-Mac/DemoQuery.m @@ -31,7 +31,7 @@ - (id) initWithQuery: (CouchQuery*)query self = [super init]; if (self != nil) { _modelClass = [CouchModel class]; - _query = [[query asLiveQuery] retain]; + _query = [query asLiveQuery]; _query.prefetch = YES; // for efficiency, include docs on first load [_query start]; @@ -45,10 +45,7 @@ - (id) initWithQuery: (CouchQuery*)query - (void) dealloc { - [_entries release]; [_query removeObserver: self forKeyPath: @"rows"]; - [_query release]; - [super dealloc]; } @@ -78,7 +75,6 @@ - (void) loadEntriesFrom: (CouchQueryEnumerator*)rows { NSLog(@" ...entries changed! (was %u, now %u)", (unsigned)_entries.count, (unsigned)entries.count); [self willChangeValueForKey: @"entries"]; - [_entries release]; _entries = [entries mutableCopy]; [self didChangeValueForKey: @"entries"]; } diff --git a/Demo-Mac/ShoppingItem.m b/Demo-Mac/ShoppingItem.m index 689928d..4aeaa9f 100644 --- a/Demo-Mac/ShoppingItem.m +++ b/Demo-Mac/ShoppingItem.m @@ -24,12 +24,6 @@ @implementation ShoppingItem -- (void)dealloc { - [_picture release]; - [super dealloc]; -} - - @dynamic check, text, created_at; @@ -58,8 +52,7 @@ - (void) setPicture:(NSImage *)picture { [self createAttachmentWithName: @"picture" type: @"image/jpeg" body: ImageJPEGData(picture)]; - [_picture release]; - _picture = [picture retain]; + _picture = picture; } diff --git a/Demo-iOS/EmptyAppDelegate.m b/Demo-iOS/EmptyAppDelegate.m index b104916..5a6dd4e 100644 --- a/Demo-iOS/EmptyAppDelegate.m +++ b/Demo-iOS/EmptyAppDelegate.m @@ -15,8 +15,8 @@ @implementation EmptyAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSError* error; - TDServer* tdServer = [[[TDServer alloc] initWithDirectory: @"/tmp/touchdb_empty_app" - error: &error] autorelease]; + TDServer* tdServer = [[TDServer alloc] initWithDirectory: @"/tmp/touchdb_empty_app" + error: &error]; NSAssert(tdServer, @"Couldn't create server: %@", error); [TDURLProtocol setServer: tdServer]; return YES; diff --git a/Listener/TDHTTPConnection.m b/Listener/TDHTTPConnection.m index 8ecf125..78bc328 100644 --- a/Listener/TDHTTPConnection.m +++ b/Listener/TDHTTPConnection.m @@ -75,10 +75,9 @@ - (BOOL)supportsMethod:(NSString *)method atPath:(NSString *)path { request: urlRequest isLocal: NO]; router.processRanges = NO; // The HTTP server framework does this already - TDHTTPResponse* response = [[[TDHTTPResponse alloc] initWithRouter: router - forConnection: self] autorelease]; + TDHTTPResponse* response = [[TDHTTPResponse alloc] initWithRouter: router + forConnection: self]; - [router release]; return response; } diff --git a/Listener/TDHTTPResponse.m b/Listener/TDHTTPResponse.m index 1acf3ba..e950152 100644 --- a/Listener/TDHTTPResponse.m +++ b/Listener/TDHTTPResponse.m @@ -38,7 +38,7 @@ - (id) initWithRouter: (TDRouter*)router forConnection:(TDHTTPConnection*)connec if (self) { //EnableLog(YES); //EnableLogTo(TDListenerVerbose, YES); - _router = [router retain]; + _router = router; _connection = connection; router.onResponseReady = ^(TDResponse* r) { [self onResponseReady: r]; @@ -68,19 +68,16 @@ - (id) initWithRouter: (TDRouter*)router forConnection:(TDHTTPConnection*)connec // Run the router, asynchronously: LogTo(TDListenerVerbose, @"%@: Starting...", self); [router start]; - [self retain]; // will be released in -cleanUp LogTo(TDListenerVerbose, @"%@: Returning from -init", self); } return self; } +#if 0 - (void)dealloc { LogTo(TDListenerVerbose, @"DEALLOC %@", self); - [_router release]; - [_response release]; - [_data release]; - [super dealloc]; } +#endif - (NSString*) description { @@ -116,7 +113,7 @@ - (BOOL) delayResponseHeaders { - (void) onResponseReady: (TDResponse*)response { @synchronized(self) { - _response = [response retain]; + _response = response; LogTo(TDListener, @" %@ --> %i", self, _response.status); if (_delayedHeaders) [_connection responseHasAvailableData: self]; @@ -143,7 +140,6 @@ - (void) onDataAvailable: (NSData*)data finished: (BOOL)finished { _dataMutable = NO; } else { if (!_dataMutable) { - [_data autorelease]; _data = [_data mutableCopy]; _dataMutable = YES; } @@ -185,7 +181,6 @@ - (NSData*) readDataOfLength: (NSUInteger)length { if (range.length == bytesAvailable) { // Client has read all of the available data, so we can discard it _dataOffset += _data.length; - [_data autorelease]; _data = nil; } LogTo(TDListenerVerbose, @"%@ sending %u bytes", self, (unsigned)result.length); @@ -207,7 +202,6 @@ - (void) cleanUp { _router.onFinished = nil; if (!_finished) { _finished = true; - [self autorelease]; } } @@ -233,7 +227,6 @@ - (void) onFinished { if (pretty) { NSString* contentType = (_response.headers)[@"Content-Type"]; if ([contentType hasPrefix: @"application/json"] && _data.length < 100000) { - [_data release]; _data = [_response.body.asPrettyJSON mutableCopy]; } } @@ -246,7 +239,6 @@ - (void) onFinished { - (void)connectionDidClose { @synchronized(self) { _connection = nil; - [_data release]; _data = nil; [self cleanUp]; } diff --git a/Listener/TDListener.m b/Listener/TDListener.m index 0bf277e..1f3dc55 100644 --- a/Listener/TDListener.m +++ b/Listener/TDListener.m @@ -30,7 +30,7 @@ @implementation TDListener - (id) initWithTDServer: (TDServer*)server port: (UInt16)port { self = [super init]; if (self) { - _tdServer = [server retain]; + _tdServer = server; _httpServer = [[TDHTTPServer alloc] init]; _httpServer.listener = self; _httpServer.tdServer = _tdServer; @@ -45,11 +45,6 @@ - (id) initWithTDServer: (TDServer*)server port: (UInt16)port { - (void)dealloc { [self stop]; - [_tdServer release]; - [_httpServer release]; - [_realm release]; - [_passwords release]; - [super dealloc]; } @@ -79,7 +74,6 @@ - (UInt16) port { - (void) setPasswords: (NSDictionary*)passwords { - [_passwords autorelease]; _passwords = [passwords copy]; _requiresAuth = (_passwords != nil); } diff --git a/Source/ChangeTracker/TDChangeTracker.h b/Source/ChangeTracker/TDChangeTracker.h index a8474d8..97129df 100644 --- a/Source/ChangeTracker/TDChangeTracker.h +++ b/Source/ChangeTracker/TDChangeTracker.h @@ -38,7 +38,7 @@ typedef enum TDChangeTrackerMode { { @protected NSURL* _databaseURL; - id _client; + id __weak _client; TDChangeTrackerMode _mode; id _lastSequenceID; unsigned _limit; @@ -62,10 +62,10 @@ typedef enum TDChangeTrackerMode { @property (readonly, nonatomic) NSString* databaseName; @property (readonly) NSURL* changesFeedURL; @property (readonly, copy, nonatomic) id lastSequenceID; -@property (retain, nonatomic) NSError* error; -@property (assign, nonatomic) id client; -@property (retain, nonatomic) NSDictionary *requestHeaders; -@property (retain, nonatomic) id authorizer; +@property (nonatomic) NSError* error; +@property (weak, nonatomic) id client; +@property (strong, nonatomic) NSDictionary *requestHeaders; +@property (strong, nonatomic) id authorizer; @property (nonatomic) TDChangeTrackerMode mode; @property (copy) NSString* filterName; diff --git a/Source/ChangeTracker/TDChangeTracker.m b/Source/ChangeTracker/TDChangeTracker.m index afe551d..e9b20a9 100644 --- a/Source/ChangeTracker/TDChangeTracker.m +++ b/Source/ChangeTracker/TDChangeTracker.m @@ -51,14 +51,13 @@ - (id)initWithDatabaseURL: (NSURL*)databaseURL if (self) { if([self class] == [TDChangeTracker class]) { // TDChangeTracker is abstract; instantiate a concrete subclass instead. - [self release]; return [[TDSocketChangeTracker alloc] initWithDatabaseURL: databaseURL mode: mode conflicts: includeConflicts lastSequence: lastSequenceID client: client]; } - _databaseURL = [databaseURL retain]; + _databaseURL = databaseURL; _client = client; _mode = mode; _heartbeat = kDefaultHeartbeat; @@ -96,7 +95,7 @@ - (NSString*) changesFeedPath { } - (NSURL*) changesFeedURL { - NSMutableString* urlStr = [[_databaseURL.absoluteString mutableCopy] autorelease]; + NSMutableString* urlStr = [_databaseURL.absoluteString mutableCopy]; if (![urlStr hasSuffix: @"/"]) [urlStr appendString: @"/"]; [urlStr appendString: self.changesFeedPath]; @@ -109,14 +108,6 @@ - (NSString*) description { - (void) dealloc { [self stop]; - [_filterName release]; - [_filterParameters release]; - [_databaseURL release]; - [_lastSequenceID release]; - [_error release]; - [_requestHeaders release]; - [_authorizer release]; - [super dealloc]; } - (void) setUpstreamError: (NSString*)message { diff --git a/Source/ChangeTracker/TDConnectionChangeTracker.m b/Source/ChangeTracker/TDConnectionChangeTracker.m index cde2391..a6e0a01 100644 --- a/Source/ChangeTracker/TDConnectionChangeTracker.m +++ b/Source/ChangeTracker/TDConnectionChangeTracker.m @@ -65,7 +65,7 @@ - (BOOL) start { [request setValue: value forHTTPHeaderField: key]; }]; - _connection = [[NSURLConnection connectionWithRequest: request delegate: self] retain]; + _connection = [NSURLConnection connectionWithRequest: request delegate: self]; _startTime = CFAbsoluteTimeGetCurrent(); LogTo(ChangeTracker, @"%@: Started... <%@>", self, request.URL); return YES; @@ -73,9 +73,7 @@ - (BOOL) start { - (void) clearConnection { - [_connection autorelease]; _connection = nil; - [_inputBuffer release]; _inputBuffer = nil; } @@ -106,7 +104,7 @@ - (bool) retryWithCredential { } [_connection cancel]; - self.authorizer = [[[TDBasicAuthorizer alloc] initWithCredential: cred] autorelease]; + self.authorizer = [[TDBasicAuthorizer alloc] initWithCredential: cred]; LogTo(ChangeTracker, @"Got 401 but retrying with %@", _authorizer); [self clearConnection]; [self start]; @@ -135,7 +133,7 @@ - (void)connection:(NSURLConnection *)connection if (challengeIsForDottedHost) { // Update the policy with the correct original hostname (without the "." suffix): host = _databaseURL.host; - SecPolicyRef policy = SecPolicyCreateSSL(YES, (CFStringRef)host); + SecPolicyRef policy = SecPolicyCreateSSL(YES, (__bridge CFStringRef)host); trust = CopyTrustWithPolicy(trust, policy); CFRelease(policy); } else { @@ -235,7 +233,7 @@ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)err - (void)connectionDidFinishLoading:(NSURLConnection *)connection { // Now parse the entire response as a JSON document: - NSData* input = [_inputBuffer retain]; + NSData* input = _inputBuffer; LogTo(ChangeTracker, @"%@: Got entire body, %u bytes", self, (unsigned)input.length); BOOL restart = NO; NSString* errorMessage = nil; @@ -250,7 +248,6 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { // ran out of changes due to a _limit rather than because we hit the end. restart = _mode == kLongPoll || numChanges == (NSInteger)_limit; } - [input release]; [self clearConnection]; diff --git a/Source/ChangeTracker/TDSocketChangeTracker.m b/Source/ChangeTracker/TDSocketChangeTracker.m index 02c07bc..f73220d 100644 --- a/Source/ChangeTracker/TDSocketChangeTracker.m +++ b/Source/ChangeTracker/TDSocketChangeTracker.m @@ -40,13 +40,13 @@ - (BOOL) start { [super start]; CFHTTPMessageRef request = CFHTTPMessageCreateRequest(NULL, CFSTR("GET"), - (CFURLRef)self.changesFeedURL, + (__bridge CFURLRef)self.changesFeedURL, kCFHTTPVersion1_1); Assert(request); // Add headers. [self.requestHeaders enumerateKeysAndObjectsUsingBlock: ^(id key, id value, BOOL *stop) { - CFHTTPMessageSetHeaderFieldValue(request, (CFStringRef)key, (CFStringRef)value); + CFHTTPMessageSetHeaderFieldValue(request, (__bridge CFStringRef)key, (__bridge CFStringRef)value); }]; if (_unauthResponse && _credential) { @@ -54,17 +54,18 @@ - (BOOL) start { if (password) { CFIndex unauthStatus = CFHTTPMessageGetResponseStatusCode(_unauthResponse); Assert(CFHTTPMessageAddAuthentication(request, _unauthResponse, - (CFStringRef)_credential.user, - (CFStringRef)password, + (__bridge CFStringRef)_credential.user, + (__bridge CFStringRef)password, kCFHTTPAuthenticationSchemeBasic, unauthStatus == 407)); } else { Warn(@"%@: Unable to get password of %@", self, _credential); } } else if (_authorizer) { - CFStringRef authHeader = [_authorizer authorizeHTTPMessage: request forRealm: nil]; + NSString* authHeader = [_authorizer authorizeHTTPMessage: request forRealm: nil]; if (authHeader) - CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Authorization"), authHeader); + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Authorization"), + (__bridge CFStringRef)(authHeader)); } CFReadStreamRef cfInputStream = CFReadStreamCreateForHTTPRequest(NULL, request); @@ -87,7 +88,7 @@ - (BOOL) start { _inputBuffer = [[NSMutableData alloc] initWithCapacity: kReadLength]; - _trackingInput = (NSInputStream*)cfInputStream; + _trackingInput = (NSInputStream*)CFBridgingRelease(cfInputStream); [_trackingInput setDelegate: self]; [_trackingInput scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSRunLoopCommonModes]; [_trackingInput open]; @@ -99,12 +100,8 @@ - (BOOL) start { - (void) clearConnection { [_trackingInput close]; - [_trackingInput release]; _trackingInput = nil; - - [_inputBuffer release]; _inputBuffer = nil; - [_changeBuffer release]; _changeBuffer = nil; } @@ -123,8 +120,6 @@ - (void) stop { - (void)dealloc { if (_unauthResponse) CFRelease(_unauthResponse); - [_credential release]; - [super dealloc]; } @@ -135,10 +130,9 @@ - (BOOL) checkSSLCert { SecTrustRef sslTrust = (SecTrustRef) CFReadStreamCopyProperty((CFReadStreamRef)_trackingInput, kCFStreamPropertySSLPeerTrust); if (sslTrust) { - CFURLRef cfURL = CFReadStreamCopyProperty((CFReadStreamRef)_trackingInput, - kCFStreamPropertyHTTPFinalURL); - BOOL trusted = [TDRemoteRequest checkTrust: sslTrust forHost: [(NSURL*)cfURL host]]; - CFRelease(cfURL); + NSURL* url = CFBridgingRelease(CFReadStreamCopyProperty((CFReadStreamRef)_trackingInput, + kCFStreamPropertyHTTPFinalURL)); + BOOL trusted = [TDRemoteRequest checkTrust: sslTrust forHost: url.host]; CFRelease(sslTrust); if (!trusted) { //TODO: This error could be made more precise @@ -157,8 +151,8 @@ - (NSURLCredential*) credentialForResponse: (CFHTTPMessageRef)response { NSString* authenticationMethod; // Basic & digest auth: http://www.ietf.org/rfc/rfc2617.txt - CFStringRef str = CFHTTPMessageCopyHeaderFieldValue(response, CFSTR("WWW-Authenticate")); - NSString* authHeader = [NSMakeCollectable(str) autorelease]; + NSString* authHeader = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(response, + CFSTR("WWW-Authenticate"))); if (!authHeader) return nil; @@ -201,7 +195,7 @@ - (BOOL) readResponseHeader { LogTo(ChangeTracker, @"%@ got status %ld", self, status); if ((status == 401 || status == 407) && !_credential && ![_requestHeaders objectForKey: @"Authorization"]) { - _credential = [[self credentialForResponse: response] retain]; + _credential = [self credentialForResponse: response]; LogTo(ChangeTracker, @"%@: Auth challenge; credential = %@", self, _credential); if (_credential) { // Recoverable auth failure -- try again with _credential: @@ -227,7 +221,7 @@ - (BOOL) readResponseHeader { - (void) readEntireInput { // After one-shot or longpoll response is complete, parse it as a single JSON document: - NSData* input = [_inputBuffer retain]; + NSData* input = _inputBuffer; LogTo(ChangeTracker, @"%@: Got entire body, %u bytes", self, (unsigned)input.length); BOOL restart = NO; NSString* errorMessage = nil; @@ -242,7 +236,6 @@ - (void) readEntireInput { // ran out of changes due to a _limit rather than because we hit the end. restart = _mode == kLongPoll || numChanges == (NSInteger)_limit; } - [input release]; [self clearConnection]; @@ -269,7 +262,7 @@ - (BOOL) checkInvalidResponse: (NSData*)body { Warn(@"%@: Unparseable response:\n%@", self, bodyStr); } else { Warn(@"%@: Response is invalid UTF-8; as CP1252:\n%@", self, - [[[NSString alloc] initWithData: body encoding: NSWindowsCP1252StringEncoding] autorelease]); + [[NSString alloc] initWithData: body encoding: NSWindowsCP1252StringEncoding]); } return NO; } @@ -403,8 +396,6 @@ - (void) errorOccurred: (NSError*)error { - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)eventCode { - [[self retain] autorelease]; // Delegate calling -stop might otherwise dealloc me - switch (eventCode) { case NSStreamEventHasBytesAvailable: { LogTo(ChangeTracker, @"%@: HasBytesAvailable %@", self, stream); diff --git a/Source/TDAttachment.m b/Source/TDAttachment.m index ac51567..e65bbd4 100644 --- a/Source/TDAttachment.m +++ b/Source/TDAttachment.m @@ -33,12 +33,6 @@ - (id) initWithName: (NSString*)name contentType: (NSString*)contentType { } -- (void)dealloc -{ - [_name release]; - [_contentType release]; - [super dealloc]; -} - (bool) isValid { diff --git a/Source/TDAuthorizer.h b/Source/TDAuthorizer.h index 6c8c9ea..bcbde40 100644 --- a/Source/TDAuthorizer.h +++ b/Source/TDAuthorizer.h @@ -17,8 +17,8 @@ - (NSString*) authorizeURLRequest: (NSMutableURLRequest*)request forRealm: (NSString*)realm; -- (CFStringRef) authorizeHTTPMessage: (CFHTTPMessageRef)message - forRealm: (NSString*)realm; +- (NSString*) authorizeHTTPMessage: (CFHTTPMessageRef)message + forRealm: (NSString*)realm; @end diff --git a/Source/TDAuthorizer.m b/Source/TDAuthorizer.m index a5eed1a..4a72bf9 100644 --- a/Source/TDAuthorizer.m +++ b/Source/TDAuthorizer.m @@ -25,16 +25,11 @@ - (id) initWithCredential: (NSURLCredential*)credential { Assert(credential); self = [super init]; if (self) { - _credential = [credential retain]; + _credential = credential; } return self; } -- (void)dealloc -{ - [_credential release]; - [super dealloc]; -} - (NSString*) authorizeURLRequest: (NSMutableURLRequest*)request forRealm: (NSString*)realm @@ -49,7 +44,7 @@ - (NSString*) authorizeURLRequest: (NSMutableURLRequest*)request return nil; } -- (CFStringRef) authorizeHTTPMessage: (CFHTTPMessageRef)message +- (NSString*) authorizeHTTPMessage: (CFHTTPMessageRef)message forRealm: (NSString*)realm { NSString* username = _credential.user; @@ -57,7 +52,7 @@ - (CFStringRef) authorizeHTTPMessage: (CFHTTPMessageRef)message if (username && password) { NSString* seekrit = $sprintf(@"%@:%@", username, password); seekrit = [TDBase64 encode: [seekrit dataUsingEncoding: NSUTF8StringEncoding]]; - return (CFStringRef) [@"Basic " stringByAppendingString: seekrit]; + return [@"Basic " stringByAppendingString: seekrit]; } return nil; } @@ -86,7 +81,6 @@ - (id) initWithKey: (NSString*)key else if ([algorithm isEqualToString: @"hmac-sha-256"]) _hmacFunction = &TDHMACSHA256; else { - [self release]; return nil; } } @@ -94,13 +88,6 @@ - (id) initWithKey: (NSString*)key } -- (void)dealloc -{ - [_key release]; - [_identifier release]; - [_issueTime release]; - [super dealloc]; -} - (NSString*) authorizeMethod: (NSString*)httpMethod @@ -145,15 +132,15 @@ - (NSString*) authorizeURLRequest: (NSMutableURLRequest*)request } -- (CFStringRef) authorizeHTTPMessage: (CFHTTPMessageRef)message - forRealm: (NSString*)realm +- (NSString*) authorizeHTTPMessage: (CFHTTPMessageRef)message + forRealm: (NSString*)realm { if (!message) return nil; - NSString* method = [(id)CFHTTPMessageCopyRequestMethod(message) autorelease]; - NSURL* url = [(id)CFHTTPMessageCopyRequestURL(message) autorelease]; - NSData* body = [(id)CFHTTPMessageCopyBody(message) autorelease]; - return (CFStringRef) [self authorizeMethod: method URL: url body: body]; + NSString* method = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(message)); + NSURL* url = CFBridgingRelease(CFHTTPMessageCopyRequestURL(message)); + NSData* body = CFBridgingRelease(CFHTTPMessageCopyBody(message)); + return [self authorizeMethod: method URL: url body: body]; } diff --git a/Source/TDBase64.m b/Source/TDBase64.m index 7205129..c321d9f 100644 --- a/Source/TDBase64.m +++ b/Source/TDBase64.m @@ -58,8 +58,8 @@ + (NSString*) encode: (const void*)input length: (size_t)length { output[index + 3] = (i + 2) < length ? kEncodingTable[(value >> 0) & 0x3F] : '='; } - return [[[NSString alloc] initWithData:data - encoding:NSASCIIStringEncoding] autorelease]; + return [[NSString alloc] initWithData:data + encoding:NSASCIIStringEncoding]; } diff --git a/Source/TDBatcher.m b/Source/TDBatcher.m index 9e79a7a..01b2d7f 100644 --- a/Source/TDBatcher.m +++ b/Source/TDBatcher.m @@ -31,11 +31,6 @@ - (id) initWithCapacity: (NSUInteger)capacity } -- (void)dealloc { - [_inbox release]; - [_processor release]; - [super dealloc]; -} - (void) unschedule { @@ -63,7 +58,7 @@ - (void) processNow { if (count == 0) { return; } else if (count <= _capacity) { - toProcess = [_inbox autorelease]; + toProcess = _inbox; _inbox = nil; } else { toProcess = [_inbox subarrayWithRange: NSMakeRange(0, _capacity)]; @@ -105,7 +100,7 @@ - (void) flush { - (void) flushAll { if (_inbox.count > 0) { [self unschedule]; - NSArray* toProcess = [_inbox autorelease]; + NSArray* toProcess = _inbox; _inbox = nil; _processor(toProcess); } diff --git a/Source/TDBlobStore.m b/Source/TDBlobStore.m index c599011..4cc0816 100644 --- a/Source/TDBlobStore.m +++ b/Source/TDBlobStore.m @@ -40,7 +40,6 @@ - (id) initWithPath: (NSString*)dir error: (NSError**)outError { withIntermediateDirectories: NO attributes: nil error: outError]) { - [self release]; return nil; } } @@ -49,11 +48,6 @@ - (id) initWithPath: (NSString*)dir error: (NSError**)outError { } -- (void)dealloc { - [_path release]; - [_tempDir release]; - [super dealloc]; -} + (TDBlobKey) keyForBlob: (NSData*)blob { @@ -84,7 +78,6 @@ - (NSString*) pathForKey: (TDBlobKey)key { strlcat(out, kFileExtension, sizeof(out)); NSString* name = [[NSString alloc] initWithCString: out encoding: NSASCIIStringEncoding]; NSString* path = [_path stringByAppendingPathComponent: name]; - [name release]; return path; } @@ -258,7 +251,6 @@ - (id) initWithStore: (TDBlobStore*)store { NSString* filename = [TDCreateUUID() stringByAppendingPathExtension: @"blobtmp"]; _tempPath = [[_store.tempDir stringByAppendingPathComponent: filename] copy]; if (!_tempPath) { - [self release]; return nil; } NSDictionary* attributes = nil; @@ -268,12 +260,10 @@ - (id) initWithStore: (TDBlobStore*)store { if (![[NSFileManager defaultManager] createFileAtPath: _tempPath contents: nil attributes: attributes]) { - [self release]; return nil; } - _out = [[NSFileHandle fileHandleForWritingAtPath: _tempPath] retain]; + _out = [NSFileHandle fileHandleForWritingAtPath: _tempPath]; if (!_out) { - [self release]; return nil; } } @@ -290,7 +280,6 @@ - (void) appendData: (NSData*)data { - (void) closeFile { [_out closeFile]; - [_out release]; _out = nil; } @@ -319,7 +308,6 @@ - (BOOL) install { NSString* dstPath = [_store pathForKey: _blobKey]; if ([[NSFileManager defaultManager] moveItemAtPath: _tempPath toPath: dstPath error:NULL]) { - [_tempPath release]; _tempPath = nil; } else { // If the move fails, assume it means a file with the same name already exists; in that @@ -333,14 +321,12 @@ - (void) cancel { [self closeFile]; if (_tempPath) { [[NSFileManager defaultManager] removeItemAtPath: _tempPath error: NULL]; - [_tempPath release]; _tempPath = nil; } } - (void) dealloc { [self cancel]; // Close file, and delete it if it hasn't been installed yet - [super dealloc]; } diff --git a/Source/TDBlobStore_Tests.m b/Source/TDBlobStore_Tests.m index 62f072d..a3d5aa6 100644 --- a/Source/TDBlobStore_Tests.m +++ b/Source/TDBlobStore_Tests.m @@ -16,7 +16,7 @@ NSError* error; TDBlobStore* store = [[TDBlobStore alloc] initWithPath: path error: &error]; CAssert(store, @"Couldn't create TDBlobStore: %@", error); - return [store autorelease]; + return store; } static void deleteStore(TDBlobStore* store) { @@ -40,7 +40,7 @@ static void deleteStore(TDBlobStore* store) { TestCase(TDBlobStoreWriter) { TDBlobStore* store = createStore(); - TDBlobStoreWriter* writer = [[[TDBlobStoreWriter alloc] initWithStore: store] autorelease]; + TDBlobStoreWriter* writer = [[TDBlobStoreWriter alloc] initWithStore: store]; CAssert(writer); [writer appendData: [@"part 1, " dataUsingEncoding: NSUTF8StringEncoding]]; diff --git a/Source/TDBody.m b/Source/TDBody.m index f4699b3..87b2b9f 100644 --- a/Source/TDBody.m +++ b/Source/TDBody.m @@ -39,17 +39,11 @@ - (id) initWithJSON: (NSData*)json { return self; } -- (void)dealloc { - [_object release]; - [_json release]; - [super dealloc]; -} - + (TDBody*) bodyWithProperties: (NSDictionary*)properties { - return [[[self alloc] initWithProperties: properties] autorelease]; + return [[self alloc] initWithProperties: properties]; } + (TDBody*) bodyWithJSON: (NSData*)json { - return [[[self alloc] initWithJSON: json] autorelease]; + return [[self alloc] initWithJSON: json]; } @synthesize error=_error; @@ -83,7 +77,7 @@ - (NSData*) asPrettyJSON { options: TDJSONWritingPrettyPrinted error: NULL]; if (json) { - NSMutableData* mjson = [[json mutableCopy] autorelease]; + NSMutableData* mjson = [json mutableCopy]; [mjson appendBytes: "\n" length: 1]; return mjson; } diff --git a/Source/TDCanonicalJSON.m b/Source/TDCanonicalJSON.m index b3704f5..c9ee479 100644 --- a/Source/TDCanonicalJSON.m +++ b/Source/TDCanonicalJSON.m @@ -28,19 +28,12 @@ @implementation TDCanonicalJSON - (id) initWithObject: (id)object { self = [super init]; if (self) { - _input = [object retain]; + _input = object; } return self; } -- (void)dealloc { - [_ignoreKeyPrefix release]; - [_whitelistedKeys release]; - [_output release]; - [_input release]; - [super dealloc]; -} @synthesize ignoreKeyPrefix=_ignoreKeyPrefix, whitelistedKeys=_whitelistedKeys; @@ -189,7 +182,7 @@ - (void) encode { - (NSString*) canonicalString { [self encode]; - return [[_output copy] autorelease]; + return [_output copy]; } @@ -202,7 +195,6 @@ - (NSData*) canonicalData { + (NSString*) canonicalString: (id)rootObject { TDCanonicalJSON* encoder = [[self alloc] initWithObject: rootObject]; NSString* result = encoder.canonicalString; - [encoder release]; return result; } @@ -210,7 +202,6 @@ + (NSString*) canonicalString: (id)rootObject { + (NSData*) canonicalData: (id)rootObject { TDCanonicalJSON* encoder = [[self alloc] initWithObject: rootObject]; NSData* result = encoder.canonicalData; - [encoder release]; return result; } diff --git a/Source/TDChangeTracker_Tests.m b/Source/TDChangeTracker_Tests.m index 346c36b..c71e1d9 100644 --- a/Source/TDChangeTracker_Tests.m +++ b/Source/TDChangeTracker_Tests.m @@ -19,8 +19,30 @@ #import "MYURLUtils.h" +void TestDictOf(void); +void TestDictOf(void) { + NSDictionary *d = $dict({@"seq", @1}, + {@"id", @"foo"}, + {@"changes", @[@"hi"]}); + CAssertEqual(d[@"seq"], @1); +} + + #if DEBUG +TestCase(DictOf) { + NSDictionary* z = @{@"hi": @"there"}; + NSLog(@"%@",z); + //typedef struct { __unsafe_unretained id key; __unsafe_unretained id value; } Pair; + typedef id Pair[2]; + typedef Pair Pairs[]; + Pairs pairs= { + {@"changes", @[@"hi"]} + }; + NSLog(@"it's %@", pairs[0][1]); + //NSDictionary* d = _dictof(pairs,sizeof(pairs)/sizeof(struct _dictpair)); + //CAssertEqual(d[@"changes"], @[@"hi"]); +} @interface TDChangeTrackerTester : NSObject { @@ -49,7 +71,7 @@ - (void) run: (TDChangeTracker*)tracker expectingChanges: (NSArray*)expectedChan Warn(@"Timeout contacting %@", tracker.databaseURL); return; } - AssertNil(tracker.error); + Assert(!tracker.error, nil); CAssertEqual(_changes, expectedChanges); } @@ -76,11 +98,6 @@ - (void) changeTrackerStopped:(TDChangeTracker *)tracker { _running = NO; } -- (void)dealloc -{ - [_changes release]; - [super dealloc]; -} @end @@ -99,9 +116,9 @@ static void addTemporaryCredential(NSURL* url, NSString* realm, TestCase(TDChangeTracker_Simple) { for (TDChangeTrackerMode mode = kOneShot; mode <= kContinuous; ++mode) { Log(@"Mode = %d ...", mode); - TDChangeTrackerTester* tester = [[[TDChangeTrackerTester alloc] init] autorelease]; + TDChangeTrackerTester* tester = [[TDChangeTrackerTester alloc] init]; NSURL* url = [NSURL URLWithString: @"http://snej.iriscouch.com/tdpuller_test1"]; - TDChangeTracker* tracker = [[[TDChangeTracker alloc] initWithDatabaseURL: url mode: mode conflicts: NO lastSequence: nil client: tester] autorelease]; + TDChangeTracker* tracker = [[TDChangeTracker alloc] initWithDatabaseURL: url mode: mode conflicts: NO lastSequence: nil client: tester]; NSArray* expected = $array($dict({@"seq", @1}, {@"id", @"foo"}, {@"changes", $array($dict({@"rev", @"5-ca289aa53cbbf35a5f5c799b64b1f16f"}))}), @@ -122,9 +139,9 @@ static void addTemporaryCredential(NSURL* url, NSString* realm, TestCase(TDChangeTracker_SSL) { // The only difference here is the "https:" scheme in the URL. - TDChangeTrackerTester* tester = [[[TDChangeTrackerTester alloc] init] autorelease]; + TDChangeTrackerTester* tester = [[TDChangeTrackerTester alloc] init]; NSURL* url = [NSURL URLWithString: @"https://snej.iriscouch.com/tdpuller_test1"]; - TDChangeTracker* tracker = [[[TDChangeTracker alloc] initWithDatabaseURL: url mode: kOneShot conflicts: NO lastSequence: 0 client: tester] autorelease]; + TDChangeTracker* tracker = [[TDChangeTracker alloc] initWithDatabaseURL: url mode: kOneShot conflicts: NO lastSequence: 0 client: tester]; NSArray* expected = $array($dict({@"seq", @1}, {@"id", @"foo"}, {@"changes", $array($dict({@"rev", @"5-ca289aa53cbbf35a5f5c799b64b1f16f"}))}), @@ -144,11 +161,11 @@ static void addTemporaryCredential(NSURL* url, NSString* realm, TestCase(TDChangeTracker_Auth) { // This database requires authentication to access at all. - TDChangeTrackerTester* tester = [[[TDChangeTrackerTester alloc] init] autorelease]; + TDChangeTrackerTester* tester = [[TDChangeTrackerTester alloc] init]; NSURL* url = [NSURL URLWithString: @"https://dummy@snej.iriscouch.com/tdpuller_test2_auth"]; addTemporaryCredential(url, @"snejdom", @"dummy", @"dummy"); - TDChangeTracker* tracker = [[[TDChangeTracker alloc] initWithDatabaseURL: url mode: kOneShot conflicts: NO lastSequence: 0 client: tester] autorelease]; + TDChangeTracker* tracker = [[TDChangeTracker alloc] initWithDatabaseURL: url mode: kOneShot conflicts: NO lastSequence: 0 client: tester]; NSArray* expected = $array($dict({@"seq", @1}, {@"id", @"something"}, {@"changes", $array($dict({@"rev", @"1-967a00dff5e02add41819138abb3284d"}))}) ); diff --git a/Source/TDCollateJSON.m b/Source/TDCollateJSON.m index 9ede322..cf8630d 100644 --- a/Source/TDCollateJSON.m +++ b/Source/TDCollateJSON.m @@ -179,8 +179,6 @@ static int compareStringsUnicode(const char** in1, const char** in2) { NSString* str1 = createStringFromJSON(in1); NSString* str2 = createStringFromJSON(in2); int result = (int)[str1 localizedCompare: str2]; - [str1 release]; - [str2 release]; return result; } diff --git a/Source/TDDatabase+Attachments.m b/Source/TDDatabase+Attachments.m index 59e4752..3237b60 100644 --- a/Source/TDDatabase+Attachments.m +++ b/Source/TDDatabase+Attachments.m @@ -50,7 +50,7 @@ @implementation TDDatabase (Attachments) - (TDBlobStoreWriter*) attachmentWriter { - return [[[TDBlobStoreWriter alloc] initWithStore: _attachments] autorelease]; + return [[TDBlobStoreWriter alloc] initWithStore: _attachments]; } @@ -343,14 +343,13 @@ + (BOOL) mutateAttachmentsIn: (TDRevision*)rev NSDictionary* attachment = attachments[name]; NSDictionary* editedAttachment = block(name, attachment); if (!editedAttachment) { - [editedProperties release]; return NO; // block canceled } if (editedAttachment != attachment) { if (!editedProperties) { // Make the document properties and _attachments dictionary mutable: editedProperties = [properties mutableCopy]; - editedAttachments = [[attachments mutableCopy] autorelease]; + editedAttachments = [attachments mutableCopy]; editedProperties[@"_attachments"] = editedAttachments; } editedAttachments[name] = editedAttachment; @@ -358,7 +357,7 @@ + (BOOL) mutateAttachmentsIn: (TDRevision*)rev } } if (editedProperties) { - rev.properties = [editedProperties autorelease]; + rev.properties = editedProperties; return YES; } return NO; @@ -383,7 +382,7 @@ + (void) stubOutAttachmentsIn: (TDRevision*)rev if (!stubItOut && !addFollows) return attachment; // no change // Need to modify attachment entry: - NSMutableDictionary* editedAttachment = [[attachment mutableCopy] autorelease]; + NSMutableDictionary* editedAttachment = [attachment mutableCopy]; [editedAttachment removeObjectForKey: @"data"]; if (stubItOut) { // ...then remove the 'data' and 'follows' key: @@ -416,7 +415,7 @@ - (BOOL) inlineFollowingAttachmentsIn: (TDRevision*)rev error: (NSError**)outErr error: &error]; if (!fileData) return nil; - NSMutableDictionary* editedAttachment = [[attachment mutableCopy] autorelease]; + NSMutableDictionary* editedAttachment = [attachment mutableCopy]; [editedAttachment removeObjectForKey: @"follows"]; editedAttachment[@"data"] = [TDBase64 encode: fileData]; return editedAttachment; @@ -444,8 +443,8 @@ - (NSDictionary*) attachmentsFromRevision: (TDRevision*)rev // Create a TDAttachment object: NSDictionary* attachInfo = revAttachments[name]; NSString* contentType = $castIf(NSString, attachInfo[@"content_type"]); - TDAttachment* attachment = [[[TDAttachment alloc] initWithName: name - contentType: contentType] autorelease]; + TDAttachment* attachment = [[TDAttachment alloc] initWithName: name + contentType: contentType]; NSString* newContentsBase64 = $castIf(NSString, attachInfo[@"data"]); if (newContentsBase64) { @@ -557,7 +556,7 @@ - (TDMultipartWriter*) multipartWriterForRevision: (TDRevision*)rev [writer addFileURL: [self fileForAttachmentDict: attachment]]; } } - return [writer autorelease]; + return writer; } @@ -573,9 +572,9 @@ - (TDRevision*) updateAttachment: (NSString*)filename if (filename.length == 0 || (body && !contentType) || (oldRevID && !docID) || (body && !docID)) return nil; - TDRevision* oldRev = [[[TDRevision alloc] initWithDocID: docID + TDRevision* oldRev = [[TDRevision alloc] initWithDocID: docID revID: oldRevID - deleted: NO] autorelease]; + deleted: NO]; if (oldRevID) { // Load existing revision if this is a replacement: *outStatus = [self loadRevisionBody: oldRev options: 0]; @@ -590,7 +589,7 @@ - (TDRevision*) updateAttachment: (NSString*)filename } // Update the _attachments dictionary: - NSMutableDictionary* attachments = [[oldRev[@"_attachments"] mutableCopy] autorelease]; + NSMutableDictionary* attachments = [oldRev[@"_attachments"] mutableCopy]; if (!attachments) attachments = $mdict(); if (body) { @@ -615,7 +614,7 @@ - (TDRevision*) updateAttachment: (NSString*)filename } [attachments removeObjectForKey: filename]; } - NSMutableDictionary* properties = [[oldRev.properties mutableCopy] autorelease]; + NSMutableDictionary* properties = [oldRev.properties mutableCopy]; properties[@"_attachments"] = attachments; oldRev.properties = properties; diff --git a/Source/TDDatabase+Insertion.m b/Source/TDDatabase+Insertion.m index 001fb5f..5a6d941 100644 --- a/Source/TDDatabase+Insertion.m +++ b/Source/TDDatabase+Insertion.m @@ -176,7 +176,6 @@ - (NSData*) encodeDocumentJSON: (TDRevision*)rev { properties[key] = origProps[key]; } else if (![sSpecialKeysToRemove member: key]) { Log(@"TDDatabase: Invalid top-level key '%@' in document to be inserted", key); - [properties release]; return nil; } } @@ -185,7 +184,6 @@ - (NSData*) encodeDocumentJSON: (TDRevision*)rev { // to create the new revision ID, and we need to guarantee that equivalent revision bodies // result in equal revision IDs. NSData* json = [TDCanonicalJSON canonicalData: properties]; - [properties release]; return json; } @@ -213,9 +211,9 @@ - (TDRevision*) winnerWithDocID: (SInt64)docNumericID if ($equal(winningRevID, newRev.revID)) return newRev; else { - TDRevision* winningRev = [[[TDRevision alloc] initWithDocID: newRev.docID + TDRevision* winningRev = [[TDRevision alloc] initWithDocID: newRev.docID revID: winningRevID - deleted: NO] autorelease]; + deleted: NO]; return winningRev; } } @@ -317,7 +315,6 @@ - (TDRevision*) putRevision: (TDRevision*)rev TDRevision* prevRev = [[TDRevision alloc] initWithDocID: docID revID: prevRevID deleted: NO]; status = [self validateRevision: rev previousRevision: prevRev]; - [prevRev release]; if (TDStatusIsError(status)) { *outStatus = status; return nil; @@ -411,7 +408,8 @@ - (TDRevision*) putRevision: (TDRevision*)rev *outStatus = kTDStatusBadID; // invalid previous revID (no numeric prefix) return nil; } - rev = [[rev copyWithDocID: docID revID: newRevID] autorelease]; + Assert(docID); + rev = [rev copyWithDocID: docID revID: newRevID]; // Now insert the rev itself: @@ -560,8 +558,7 @@ - (TDStatus) forceInsert: (TDRevision*)rev current = YES; } else { // It's an intermediate parent, so insert a stub: - newRev = [[[TDRevision alloc] initWithDocID: docID revID: revID deleted: NO] - autorelease]; + newRev = [[TDRevision alloc] initWithDocID: docID revID: revID deleted: NO]; } // Insert it: @@ -727,7 +724,7 @@ - (void) defineValidation: (NSString*)validationName asBlock: (TDValidationBlock if (validationBlock) { if (!_validations) _validations = [[NSMutableDictionary alloc] init]; - [_validations setValue: [[validationBlock copy] autorelease] forKey: validationName]; + [_validations setValue: [validationBlock copy] forKey: validationName]; } else { [_validations removeObjectForKey: validationName]; } @@ -745,14 +742,13 @@ - (TDStatus) validateRevision: (TDRevision*)newRev previousRevision: (TDRevision revision: oldRev newRevision: newRev]; TDStatus status = kTDStatusOK; - for (TDValidationBlock validationName in _validations) { + for (NSString* validationName in _validations) { TDValidationBlock validation = [self validationNamed: validationName]; if (!validation(newRev, context)) { status = context.errorType; break; } } - [context release]; return status; } @@ -776,16 +772,11 @@ - (id) initWithDatabase: (TDDatabase*)db _currentRevision = currentRevision; _newRevision = newRevision; _errorType = kTDStatusForbidden; - _errorMessage = [@"invalid document" retain]; + _errorMessage = @"invalid document"; } return self; } -- (void)dealloc { - [_changedKeys release]; - [_errorMessage release]; - [super dealloc]; -} - (TDRevision*) currentRevision { if (_currentRevision) diff --git a/Source/TDDatabase+LocalDocs.m b/Source/TDDatabase+LocalDocs.m index 32bcb52..100a805 100644 --- a/Source/TDDatabase+LocalDocs.m +++ b/Source/TDDatabase+LocalDocs.m @@ -46,7 +46,7 @@ - (TDRevision*) getLocalDocumentWithID: (NSString*)docID } properties[@"_id"] = docID; properties[@"_rev"] = gotRevID; - result = [[[TDRevision alloc] initWithDocID: docID revID: gotRevID deleted:NO] autorelease]; + result = [[TDRevision alloc] initWithDocID: docID revID: gotRevID deleted:NO]; result.properties = properties; } [r close]; @@ -96,7 +96,7 @@ - (TDRevision*) putLocalRevision: (TDRevision*)revision return nil; } *outStatus = kTDStatusCreated; - return [[revision copyWithDocID: docID revID: newRevID] autorelease]; + return [revision copyWithDocID: docID revID: newRevID]; } else { // DELETE: diff --git a/Source/TDDatabase+Replication.m b/Source/TDDatabase+Replication.m index 125bdaf..cd2deeb 100644 --- a/Source/TDDatabase+Replication.m +++ b/Source/TDDatabase+Replication.m @@ -62,7 +62,6 @@ - (TDReplicator*) replicatorWithRemoteURL: (NSURL*)remote object: nil]; } [_activeReplicators addObject: repl]; - [repl release]; return repl; } diff --git a/Source/TDDatabase.m b/Source/TDDatabase.m index 08b4e3f..8908d1c 100644 --- a/Source/TDDatabase.m +++ b/Source/TDDatabase.m @@ -48,7 +48,7 @@ - (NSString*) attachmentStorePath { + (TDDatabase*) createEmptyDBAtPath: (NSString*)path { if (!removeItemIfExists(path, NULL)) return nil; - TDDatabase *db = [[[self alloc] initWithPath: path] autorelease]; + TDDatabase *db = [[self alloc] initWithPath: path]; if (!removeItemIfExists(db.attachmentStorePath, NULL)) return nil; if (![db open]) @@ -70,6 +70,11 @@ - (id) initWithPath: (NSString*)path { _fmdb.logsErrors = WillLogTo(TDDatabase); #endif _fmdb.traceExecution = WillLogTo(TDDatabaseVerbose); + if (0) { + // Appease the static analyzer by using these category ivars in this source file: + _validations = nil; + _pendingAttachmentsByDigest = nil; + } } return self; } @@ -284,10 +289,12 @@ - (BOOL) close { object: self]; for (TDView* view in _views.allValues) [view databaseClosing]; - setObj(&_views, nil); - for (TDReplicator* repl in [_activeReplicators.copy autorelease]) + + _views = nil; + for (TDReplicator* repl in _activeReplicators.copy) [repl databaseClosing]; - setObj(&_activeReplicators, nil); + + _activeReplicators = nil; if (![_fmdb close]) return NO; @@ -315,17 +322,7 @@ - (void) dealloc { //Warn(@"%@ dealloced without being closed first!", self); [self close]; } - [_fmdb release]; - [_path release]; - [_name release]; - [_views release]; - [_activeReplicators release]; - [_validations release]; - [_filters release]; - [_attachments release]; - [_pendingAttachmentsByDigest release]; [[NSNotificationCenter defaultCenter] removeObserver: self]; - [super dealloc]; } @synthesize path=_path, name=_name, fmdb=_fmdb, attachmentStore=_attachments, readOnly=_readOnly; @@ -490,7 +487,6 @@ - (NSDictionary*) documentPropertiesFromJSON: (NSData*)json rev.sequence = sequence; rev.missing = (json == nil); NSDictionary* extra = [self extraPropertiesForRevision: rev options: options]; - [rev release]; if (json.length == 0 || (json.length==2 && memcmp(json.bytes, "{}", 2)==0)) return extra; // optimization, and workaround for issue #44 NSMutableDictionary* docProperties = [TDJSON JSONObjectWithData: json @@ -533,7 +529,7 @@ - (TDRevision*) getDocumentWithID: (NSString*)docID if (!revID) revID = [r stringForColumnIndex: 0]; BOOL deleted = [r boolForColumnIndex: 1]; - result = [[[TDRevision alloc] initWithDocID: docID revID: revID deleted: deleted] autorelease]; + result = [[TDRevision alloc] initWithDocID: docID revID: revID deleted: deleted]; result.sequence = [r longLongIntForColumnIndex: 2]; if (options != kTDNoBody) { @@ -609,14 +605,13 @@ - (TDRevisionList*) getAllRevisionsOfDocumentID: (NSString*)docID FMResultSet* r = [_fmdb executeQuery: sql, @(docNumericID)]; if (!r) return nil; - TDRevisionList* revs = [[[TDRevisionList alloc] init] autorelease]; + TDRevisionList* revs = [[TDRevisionList alloc] init]; while ([r next]) { TDRevision* rev = [[TDRevision alloc] initWithDocID: docID revID: [r stringForColumnIndex: 1] deleted: [r boolForColumnIndex: 2]]; rev.sequence = [r longLongIntForColumnIndex: 0]; [revs addRev: rev]; - [rev release]; } [r close]; return revs; @@ -629,7 +624,7 @@ - (TDRevisionList*) getAllRevisionsOfDocumentID: (NSString*)docID if (docNumericID < 0) return nil; else if (docNumericID == 0) - return [[[TDRevisionList alloc] init] autorelease]; // no such document + return [[TDRevisionList alloc] init]; // no such document else return [self getAllRevisionsOfDocumentID: docID numericID: docNumericID @@ -711,7 +706,6 @@ - (NSArray*) getRevisionHistory: (TDRevision*)rev { rev.sequence = sequence; rev.missing = [r boolForColumnIndex: 4]; [history addObject: rev]; - [rev release]; lastSequence = [r longLongIntForColumnIndex: 1]; if (lastSequence == 0) break; @@ -806,7 +800,7 @@ - (TDRevisionList*) changesSinceSequence: (SequenceNumber)lastSequence FMResultSet* r = [_fmdb executeQuery: sql, @(lastSequence)]; if (!r) return nil; - TDRevisionList* changes = [[[TDRevisionList alloc] init] autorelease]; + TDRevisionList* changes = [[TDRevisionList alloc] init]; int64_t lastDocID = 0; while ([r next]) { @autoreleasepool { @@ -829,7 +823,6 @@ - (TDRevisionList*) changesSinceSequence: (SequenceNumber)lastSequence } if (!filter || filter(rev, filterParams)) [changes addRev: rev]; - [rev release]; } } [r close]; @@ -845,7 +838,7 @@ - (TDRevisionList*) changesSinceSequence: (SequenceNumber)lastSequence - (void) defineFilter: (NSString*)filterName asBlock: (TDFilterBlock)filterBlock { if (!_filters) _filters = [[NSMutableDictionary alloc] init]; - [_filters setValue: [[filterBlock copy] autorelease] forKey: filterName]; + [_filters setValue: [filterBlock copy] forKey: filterName]; } - (TDFilterBlock) filterNamed: (NSString*)filterName { @@ -870,7 +863,7 @@ - (TDView*) viewNamed: (NSString*)name { TDView* view = _views[name]; if (view) return view; - return [self registerView: [[[TDView alloc] initWithDatabase: self name: name] autorelease]]; + return [self registerView: [[TDView alloc] initWithDatabase: self name: name]]; } @@ -878,7 +871,7 @@ - (TDView*) existingViewNamed: (NSString*)name { TDView* view = _views[name]; if (view) return view; - view = [[[TDView alloc] initWithDatabase: self name: name] autorelease]; + view = [[TDView alloc] initWithDatabase: self name: name]; if (!view.viewID) return nil; return [self registerView: view]; @@ -915,7 +908,7 @@ - (NSDictionary*) getDocsWithIDs: (NSArray*)docIDs options: (const TDQueryOption update_seq = self.lastSequence; // TODO: needs to be atomic with the following SELECT // Generate the SELECT statement, based on the options: - NSMutableString* sql = [[@"SELECT revs.doc_id, docid, revid" mutableCopy] autorelease]; + NSMutableString* sql = [@"SELECT revs.doc_id, docid, revid" mutableCopy]; if (options->includeDocs) [sql appendString: @", json, sequence"]; if (options->includeDeletedDocs) @@ -1044,7 +1037,7 @@ - (NSDictionary*) getAllDocs: (const TDQueryOptions*)options { #if DEBUG static TDRevision* mkrev(NSString* revID) { - return [[[TDRevision alloc] initWithDocID: @"docid" revID: revID deleted: NO] autorelease]; + return [[TDRevision alloc] initWithDocID: @"docid" revID: revID deleted: NO]; } diff --git a/Source/TDDatabaseManager.m b/Source/TDDatabaseManager.m index a28011d..86d92e4 100644 --- a/Source/TDDatabaseManager.m +++ b/Source/TDDatabaseManager.m @@ -34,8 +34,8 @@ @implementation TDDatabaseManager + (void) initialize { if (self == [TDDatabaseManager class]) { - kIllegalNameChars = [[[NSCharacterSet characterSetWithCharactersInString: kLegalChars] - invertedSet] retain]; + kIllegalNameChars = [[NSCharacterSet characterSetWithCharactersInString: kLegalChars] + invertedSet]; } } @@ -49,7 +49,7 @@ + (TDDatabaseManager*) createEmptyAtPath: (NSString*)path { error: &error]; Assert(dbm, @"Failed to create db manager at %@: %@", path, error); AssertEqual(dbm.directory, path); - return [dbm autorelease]; + return dbm; } + (TDDatabaseManager*) createEmptyAtTemporaryPath: (NSString*)name { @@ -77,7 +77,6 @@ - (id) initWithDirectory: (NSString*)dirPath error: &error]) { if (!TDIsFileExistsError(error)) { if (outError) *outError = error; - [self release]; return nil; } } @@ -89,9 +88,6 @@ - (id) initWithDirectory: (NSString*)dirPath - (void)dealloc { LogTo(TDServer, @"DEALLOC %@", self); [self close]; - [_dir release]; - [_databases release]; - [super dealloc]; } @@ -128,12 +124,10 @@ - (TDDatabase*) databaseNamed: (NSString*)name create: (BOOL)create { db = [[TDDatabase alloc] initWithPath: path]; db.readOnly = _options.readOnly; if (!create && !db.exists) { - [db release]; return nil; } db.name = name; _databases[name] = db; - [db release]; } return db; } @@ -180,7 +174,6 @@ - (NSArray*) allOpenDatabases { - (void) close { LogTo(TDServer, @"CLOSE %@", self); [_replicatorManager stop]; - [_replicatorManager release]; _replicatorManager = nil; for (TDDatabase* db in _databases.allValues) { [db close]; diff --git a/Source/TDDatabase_Tests.m b/Source/TDDatabase_Tests.m index 227e175..24ccde2 100644 --- a/Source/TDDatabase_Tests.m +++ b/Source/TDDatabase_Tests.m @@ -51,7 +51,7 @@ static TDRevision* putDoc(TDDatabase* db, NSDictionary* props) { - TDRevision* rev = [[[TDRevision alloc] initWithProperties: props] autorelease]; + TDRevision* rev = [[TDRevision alloc] initWithProperties: props]; TDStatus status; TDRevision* result = [db putRevision: rev prevRevisionID: props[@"_rev"] @@ -87,8 +87,8 @@ // Create a document: NSMutableDictionary* props = $mdict({@"foo", @1}, {@"bar", $false}); - TDBody* doc = [[[TDBody alloc] initWithProperties: props] autorelease]; - TDRevision* rev1 = [[[TDRevision alloc] initWithBody: doc] autorelease]; + TDBody* doc = [[TDBody alloc] initWithProperties: props]; + TDRevision* rev1 = [[TDRevision alloc] initWithBody: doc]; CAssert(rev1); TDStatus status; rev1 = [db putRevision: rev1 prevRevisionID: nil allowConflict: NO status: &status]; @@ -103,10 +103,10 @@ CAssertEqual(userProperties(readRev.properties), userProperties(doc.properties)); // Now update it: - props = [[readRev.properties mutableCopy] autorelease]; + props = [readRev.properties mutableCopy]; props[@"status"] = @"updated!"; doc = [TDBody bodyWithProperties: props]; - TDRevision* rev2 = [[[TDRevision alloc] initWithBody: doc] autorelease]; + TDRevision* rev2 = [[TDRevision alloc] initWithBody: doc]; TDRevision* rev2Input = rev2; rev2 = [db putRevision: rev2 prevRevisionID: rev1.revID allowConflict: NO status: &status]; CAssertEq(status, kTDStatusCreated); @@ -142,8 +142,8 @@ CAssertEq(changes.count, 0u); // Delete it: - TDRevision* revD = [[[TDRevision alloc] initWithDocID: rev2.docID revID: nil deleted: YES] autorelease]; - CAssertEq([db putRevision: revD prevRevisionID: nil allowConflict: NO status: &status], nil); + TDRevision* revD = [[TDRevision alloc] initWithDocID: rev2.docID revID: nil deleted: YES]; + CAssertEqual([db putRevision: revD prevRevisionID: nil allowConflict: NO status: &status], nil); CAssertEq(status, kTDStatusConflict); revD = [db putRevision: revD prevRevisionID: rev2.revID allowConflict: NO status: &status]; CAssertEq(status, kTDStatusOK); @@ -151,7 +151,7 @@ CAssert([revD.revID hasPrefix: @"3-"]); // Delete nonexistent doc: - TDRevision* revFake = [[[TDRevision alloc] initWithDocID: @"fake" revID: nil deleted: YES] autorelease]; + TDRevision* revFake = [[TDRevision alloc] initWithDocID: @"fake" revID: nil deleted: YES]; [db putRevision: revFake prevRevisionID: nil allowConflict: NO status: &status]; CAssertEq(status, kTDStatusNotFound); @@ -229,7 +229,7 @@ // POST a valid new document: NSMutableDictionary* props = $mdict({@"name", @"Zaphod Beeblebrox"}, {@"towel", @"velvet"}); - TDRevision* rev = [[[TDRevision alloc] initWithProperties: props] autorelease]; + TDRevision* rev = [[TDRevision alloc] initWithProperties: props]; TDStatus status; validationCalled = NO; rev = [db putRevision: rev prevRevisionID: nil allowConflict: NO status: &status]; @@ -255,7 +255,7 @@ // POST an invalid new document: props = $mdict({@"name", @"Vogon"}, {@"poetry", $true}); - rev = [[[TDRevision alloc] initWithProperties: props] autorelease]; + rev = [[TDRevision alloc] initWithProperties: props]; validationCalled = NO; rev = [db putRevision: rev prevRevisionID: nil allowConflict: NO status: &status]; CAssert(validationCalled); @@ -263,7 +263,7 @@ // PUT a valid new document with an ID: props = $mdict({@"_id", @"ford"}, {@"name", @"Ford Prefect"}, {@"towel", @"terrycloth"}); - rev = [[[TDRevision alloc] initWithProperties: props] autorelease]; + rev = [[TDRevision alloc] initWithProperties: props]; validationCalled = NO; rev = [db putRevision: rev prevRevisionID: nil allowConflict: NO status: &status]; CAssert(validationCalled); @@ -271,7 +271,7 @@ CAssertEqual(rev.docID, @"ford"); // DELETE a document: - rev = [[[TDRevision alloc] initWithDocID: rev.docID revID: rev.revID deleted: YES] autorelease]; + rev = [[TDRevision alloc] initWithDocID: rev.docID revID: rev.revID deleted: YES]; CAssert(rev.deleted); validationCalled = NO; rev = [db putRevision: rev prevRevisionID: rev.revID allowConflict: NO status: &status]; @@ -280,7 +280,7 @@ // PUT an invalid new document: props = $mdict({@"_id", @"petunias"}, {@"name", @"Pot of Petunias"}); - rev = [[[TDRevision alloc] initWithProperties: props] autorelease]; + rev = [[TDRevision alloc] initWithProperties: props]; validationCalled = NO; rev = [db putRevision: rev prevRevisionID: nil allowConflict: NO status: &status]; CAssert(validationCalled); @@ -323,7 +323,7 @@ static void verifyHistory(TDDatabase* db, TDRevision* rev, NSArray* history, boo noteInfo = n.userInfo; }]; - TDRevision* rev = [[[TDRevision alloc] initWithDocID: @"MyDocID" revID: @"4-foxy" deleted: NO] autorelease]; + TDRevision* rev = [[TDRevision alloc] initWithDocID: @"MyDocID" revID: @"4-foxy" deleted: NO]; rev.properties = $dict({@"_id", rev.docID}, {@"_rev", rev.revID}, {@"message", @"hi"}); NSArray* history = @[rev.revID, @"3-thrice", @"2-too", @"1-won"]; noteInfo = nil; @@ -334,7 +334,7 @@ static void verifyHistory(TDDatabase* db, TDRevision* rev, NSArray* history, boo CAssertEqual(noteInfo, (@{ @"rev" : rev, @"winner": rev })); - TDRevision* conflict = [[[TDRevision alloc] initWithDocID: @"MyDocID" revID: @"5-epsilon" deleted: NO] autorelease]; + TDRevision* conflict = [[TDRevision alloc] initWithDocID: @"MyDocID" revID: @"5-epsilon" deleted: NO]; conflict.properties = $dict({@"_id", conflict.docID}, {@"_rev", conflict.revID}, {@"message", @"yo"}); NSArray* conflictHistory = @[conflict.revID, @"4-delta", @"3-gamma", @"2-too", @"1-won"]; @@ -346,7 +346,7 @@ static void verifyHistory(TDDatabase* db, TDRevision* rev, NSArray* history, boo CAssertEqual(noteInfo, (@{ @"rev" : conflict, @"winner": conflict })); // Add an unrelated document: - TDRevision* other = [[[TDRevision alloc] initWithDocID: @"AnotherDocID" revID: @"1-ichi" deleted: NO] autorelease]; + TDRevision* other = [[TDRevision alloc] initWithDocID: @"AnotherDocID" revID: @"1-ichi" deleted: NO]; other.properties = $dict({@"language", @"jp"}); noteInfo = nil; status = [db forceInsert: other revisionHistory: @[other.revID] source: nil]; @@ -381,7 +381,7 @@ static void verifyHistory(TDDatabase* db, TDRevision* rev, NSArray* history, boo verifyHistory(db, conflict, conflictHistory, true); // Delete the current winning rev, leaving the other one: - TDRevision* del1 = [[[TDRevision alloc] initWithDocID: conflict.docID revID: nil deleted: YES] autorelease]; + TDRevision* del1 = [[TDRevision alloc] initWithDocID: conflict.docID revID: nil deleted: YES]; noteInfo = nil; del1 = [db putRevision: del1 prevRevisionID: conflict.revID allowConflict: NO status: &status]; @@ -393,13 +393,13 @@ static void verifyHistory(TDDatabase* db, TDRevision* rev, NSArray* history, boo verifyHistory(db, rev, history, true); // Delete the remaining rev: - TDRevision* del2 = [[[TDRevision alloc] initWithDocID: rev.docID revID: nil deleted: YES] autorelease]; + TDRevision* del2 = [[TDRevision alloc] initWithDocID: rev.docID revID: nil deleted: YES]; noteInfo = nil; del2 = [db putRevision: del2 prevRevisionID: rev.revID allowConflict: NO status: &status]; CAssertEq(status, 200); current = [db getDocumentWithID: rev.docID revisionID: nil]; - CAssertEq(current, nil); + CAssertEqual(current, nil); TDRevision* maxDel = TDCompareRevIDs(del1.revID, del2.revID) > 0 ? del1 : nil; CAssertEqual(noteInfo, (@{ @"rev" : del2, @"winner": maxDel })); @@ -429,7 +429,7 @@ static void verifyHistory(TDDatabase* db, TDRevision* rev, NSArray* history, boo {@"key", @"new-value"}); TDRevision* rev2a = putDoc(db, props); - TDRevision* rev2b = [[[TDRevision alloc] initWithProperties: props] autorelease]; + TDRevision* rev2b = [[TDRevision alloc] initWithProperties: props]; TDStatus status; rev2b = [db putRevision: rev2b prevRevisionID: rev1.revID @@ -451,7 +451,6 @@ static void insertAttachment(TDDatabase* db, NSData* blob, unsigned revpos) { TDAttachment* attachment = [[TDAttachment alloc] initWithName: name contentType: type]; - [attachment autorelease]; CAssert([db storeBlob: blob creatingKey: &attachment->blobKey], @"Failed to store blob"); attachment->encoding = encoding; attachment->length = length; @@ -799,8 +798,8 @@ static void insertAttachment(TDDatabase* db, NSData* blob, // Create a document: NSMutableDictionary* props = $mdict({@"_id", @"_local/doc1"}, {@"foo", @1}, {@"bar", $false}); - TDBody* doc = [[[TDBody alloc] initWithProperties: props] autorelease]; - TDRevision* rev1 = [[[TDRevision alloc] initWithBody: doc] autorelease]; + TDBody* doc = [[TDBody alloc] initWithProperties: props]; + TDRevision* rev1 = [[TDRevision alloc] initWithBody: doc]; TDStatus status; rev1 = [db putLocalRevision: rev1 prevRevisionID: nil status: &status]; CAssertEq(status, kTDStatusCreated); @@ -816,10 +815,10 @@ static void insertAttachment(TDDatabase* db, NSData* blob, CAssertEqual(userProperties(readRev.properties), userProperties(doc.properties)); // Now update it: - props = [[readRev.properties mutableCopy] autorelease]; + props = [readRev.properties mutableCopy]; props[@"status"] = @"updated!"; doc = [TDBody bodyWithProperties: props]; - TDRevision* rev2 = [[[TDRevision alloc] initWithBody: doc] autorelease]; + TDRevision* rev2 = [[TDRevision alloc] initWithBody: doc]; TDRevision* rev2Input = rev2; rev2 = [db putLocalRevision: rev2 prevRevisionID: rev1.revID status: &status]; CAssertEq(status, kTDStatusCreated); @@ -837,14 +836,14 @@ static void insertAttachment(TDDatabase* db, NSData* blob, CAssertEq(status, kTDStatusConflict); // Delete it: - TDRevision* revD = [[[TDRevision alloc] initWithDocID: rev2.docID revID: nil deleted: YES] autorelease]; - CAssertEq([db putLocalRevision: revD prevRevisionID: nil status: &status], nil); + TDRevision* revD = [[TDRevision alloc] initWithDocID: rev2.docID revID: nil deleted: YES]; + CAssertEqual([db putLocalRevision: revD prevRevisionID: nil status: &status], nil); CAssertEq(status, kTDStatusConflict); revD = [db putLocalRevision: revD prevRevisionID: rev2.revID status: &status]; CAssertEq(status, kTDStatusOK); // Delete nonexistent doc: - TDRevision* revFake = [[[TDRevision alloc] initWithDocID: @"_local/fake" revID: nil deleted: YES] autorelease]; + TDRevision* revFake = [[TDRevision alloc] initWithDocID: @"_local/fake" revID: nil deleted: YES]; [db putLocalRevision: revFake prevRevisionID: nil status: &status]; CAssertEq(status, kTDStatusNotFound); @@ -870,10 +869,10 @@ static void insertAttachment(TDDatabase* db, NSData* blob, putDoc(db, $dict({@"_id", @"11111"}, {@"_rev", doc1r2.revID}, {@"_deleted", $true})); // Now call -findMissingRevisions: - TDRevision* revToFind1 = [[[TDRevision alloc] initWithDocID: @"11111" revID: @"3-bogus" deleted: NO] autorelease]; - TDRevision* revToFind2 = [[[TDRevision alloc] initWithDocID: @"22222" revID: doc2r2.revID deleted: NO] autorelease]; - TDRevision* revToFind3 = [[[TDRevision alloc] initWithDocID: @"99999" revID: @"9-huh" deleted: NO] autorelease]; - TDRevisionList* revs = [[[TDRevisionList alloc] initWithArray: @[revToFind1, revToFind2, revToFind3]] autorelease]; + TDRevision* revToFind1 = [[TDRevision alloc] initWithDocID: @"11111" revID: @"3-bogus" deleted: NO]; + TDRevision* revToFind2 = [[TDRevision alloc] initWithDocID: @"22222" revID: doc2r2.revID deleted: NO]; + TDRevision* revToFind3 = [[TDRevision alloc] initWithDocID: @"99999" revID: @"9-huh" deleted: NO]; + TDRevisionList* revs = [[TDRevisionList alloc] initWithArray: @[revToFind1, revToFind2, revToFind3]]; CAssert([db findMissingRevisions: revs]); CAssertEqual(revs.allRevisions, (@[revToFind1, revToFind3])); diff --git a/Source/TDJSON.m b/Source/TDJSON.m index 0d1def2..b83744c 100644 --- a/Source/TDJSON.m +++ b/Source/TDJSON.m @@ -38,7 +38,6 @@ + (NSData *)dataWithJSONObject:(id)object NSData* json = [super dataWithJSONObject: object options: (options & ~TDJSONWritingAllowFragments) error: NULL]; - [object release]; return [json subdataWithRange: NSMakeRange(1, json.length - 2)]; } else { return [super dataWithJSONObject: object options: options error: error]; @@ -114,17 +113,11 @@ @implementation TDLazyArrayOfJSON - (id) initWithArray: (NSMutableArray*)array { self = [super init]; if (self) { - _array = [array retain]; + _array = array; } return self; } -- (void)dealloc -{ - [_array release]; - [super dealloc]; -} - - (NSUInteger)count { return _array.count; } diff --git a/Source/TDMisc.m b/Source/TDMisc.m index 25cab6b..1ab1b67 100644 --- a/Source/TDMisc.m +++ b/Source/TDMisc.m @@ -36,10 +36,17 @@ uuid_unparse_lower(uuid, cstr); return [[[NSString alloc] initWithCString: cstr encoding: NSASCIIStringEncoding] autorelease]; #else + CFUUIDRef uuid = CFUUIDCreate(NULL); - NSString* str = NSMakeCollectable(CFUUIDCreateString(NULL, uuid)); +#ifdef __OBJC_GC__ + CFStringRef uuidStrRef = CFUUIDCreateString(NULL, uuid); + NSString *uuidStr = (NSString *)uuidStrRef; + CFRelease(uuidStrRef); +#else + NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid); +#endif CFRelease(uuid); - return [str autorelease]; + return uuidStr; #endif } @@ -77,9 +84,9 @@ char *dst = &hex[0]; for( size_t i=0; i -@property (readwrite, retain) NSError* error; +@property (readwrite, strong) NSError* error; @end @@ -40,7 +40,6 @@ - (id)initWithBufferSize: (NSUInteger)bufferSize { _bufferSize = bufferSize; _buffer = malloc(_bufferSize); if (!_buffer) { - [self release]; return nil; } } @@ -55,11 +54,6 @@ - (id)init { - (void) dealloc { [self close]; free(_buffer); - [_inputs release]; - [_currentInput release]; - [_output release]; - [_error release]; - [super dealloc]; } @@ -105,7 +99,7 @@ - (BOOL) isOpen { - (void) opened { - setObj(&_error, nil); + _error = nil; _totalBytesWritten = 0; _output.delegate = self; @@ -121,12 +115,15 @@ - (NSInputStream*) openForInputStream { #ifdef GNUSTEP Assert(NO, @"Unimplemented CFStreamCreateBoundPair"); // TODO: Add this to GNUstep base fw #else - CFStreamCreateBoundPair(NULL, (CFReadStreamRef*)&_input, (CFWriteStreamRef*)&_output, - _bufferSize); + CFReadStreamRef cfInput; + CFWriteStreamRef cfOutput; + CFStreamCreateBoundPair(NULL, &cfInput, &cfOutput, _bufferSize); + _input = CFBridgingRelease(cfInput); + _output = CFBridgingRelease(cfOutput); #endif LogTo(TDMultiStreamWriter, @"%@: Opened input=%p, output=%p", self, _input, _output); [self opened]; - return [_input autorelease]; + return _input; } @@ -134,7 +131,7 @@ - (void) openForOutputTo: (NSOutputStream*)output { Assert(output); Assert(!_output, @"Already open"); Assert(!_input); - _output = [output retain]; + _output = output; [self opened]; } @@ -143,13 +140,13 @@ - (void) close { LogTo(TDMultiStreamWriter, @"%@: Closed", self); [_output close]; _output.delegate = nil; - setObj(&_output, nil); + _output = nil; _input = nil; _bufferLength = 0; [_currentInput close]; - setObj(&_currentInput, nil); + _currentInput = nil; _nextInputIndex = 0; } @@ -173,10 +170,10 @@ - (NSInputStream*) streamForInput: (id)input { - (BOOL) openNextInput { if (_currentInput) { [_currentInput close]; - setObj(&_currentInput, nil); + _currentInput = nil; } if (_nextInputIndex < _inputs.count) { - _currentInput = [[self streamForInput: _inputs[_nextInputIndex]] retain]; + _currentInput = [self streamForInput: _inputs[_nextInputIndex]]; ++_nextInputIndex; [_currentInput open]; return YES; @@ -318,7 +315,7 @@ - (NSData*) allOutput { #define kExpectedOutputString @"<2nd part, again unnecessarily prolonged for testing purposes beyond any reasonable length...>" static TDMultiStreamWriter* createWriter(unsigned bufSize) { - TDMultiStreamWriter* stream = [[[TDMultiStreamWriter alloc] initWithBufferSize: bufSize] autorelease]; + TDMultiStreamWriter* stream = [[TDMultiStreamWriter alloc] initWithBufferSize: bufSize]; [stream addData: [@"" dataUsingEncoding: NSUTF8StringEncoding]]; [stream addData: [@"<2nd part, again unnecessarily prolonged for testing purposes beyond any reasonable length...>" dataUsingEncoding: NSUTF8StringEncoding]]; CAssertEq(stream.length, (SInt64)kExpectedOutputString.length); @@ -359,10 +356,6 @@ - (id)initWithStream: (NSInputStream*)stream { return self; } -- (void)dealloc { - [_output release]; - [super dealloc]; -} - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)event { AssertEq(stream, _stream); @@ -394,7 +387,7 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)event { TDMultiStreamWriter* writer = createWriter(16); NSInputStream* input = [writer openForInputStream]; CAssert(input); - TDMultiStreamWriterTester *tester = [[[TDMultiStreamWriterTester alloc] initWithStream: input] autorelease]; + TDMultiStreamWriterTester *tester = [[TDMultiStreamWriterTester alloc] initWithStream: input]; NSRunLoop* rl = [NSRunLoop currentRunLoop]; [input scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; Log(@"Opening stream"); diff --git a/Source/TDMultipartDocumentReader.m b/Source/TDMultipartDocumentReader.m index 76d85a3..70a0e07 100644 --- a/Source/TDMultipartDocumentReader.m +++ b/Source/TDMultipartDocumentReader.m @@ -40,11 +40,10 @@ + (NSDictionary*) readData: (NSData*)data if ([reader setContentType: contentType] && [reader appendData: data] && [reader finish]) { - result = [[reader.document retain] autorelease]; + result = reader.document; } if (outStatus) *outStatus = reader.status; - [reader release]; return result; } @@ -62,14 +61,6 @@ - (id) initWithDatabase: (TDDatabase*)database - (void) dealloc { [_curAttachment cancel]; - [_curAttachment release]; - [_multipartReader release]; - [_jsonBuffer release]; - [_document release]; - [_attachmentsByName autorelease]; - [_attachmentsByDigest autorelease]; - [_completionBlock release]; - [super dealloc]; } @@ -149,7 +140,7 @@ + (TDStatus) readStream: (NSInputStream*)stream toDatabase: (TDDatabase*)database then: (TDMultipartDocumentReaderCompletionBlock)onCompletion { - TDMultipartDocumentReader* reader = [[[self alloc] initWithDatabase: database] autorelease]; + TDMultipartDocumentReader* reader = [[self alloc] initWithDatabase: database]; return [reader readStream: stream ofType: contentType then: onCompletion]; } @@ -160,7 +151,7 @@ - (TDStatus) readStream: (NSInputStream*)stream { if ([self setContentType: contentType]) { LogTo(SyncVerbose, @"%@: Reading from input stream...", self); - [self retain]; // balanced by release in -finishAsync: + // balanced by release in -finishAsync: _completionBlock = [completionBlock copy]; [stream open]; stream.delegate = self; @@ -210,9 +201,8 @@ - (void) finishAsync: (NSInputStream*)stream { if (!TDStatusIsError(_status)) [self finish]; _completionBlock(self); - [_completionBlock release]; _completionBlock = nil; - [self release]; // balances -retain in -readStream: + // balances -retain in -readStream: } @@ -227,7 +217,7 @@ - (void) startedPart: (NSDictionary*)headers { else { LogTo(SyncVerbose, @"%@: Starting attachment #%u...", self, (unsigned)_attachmentsByDigest.count + 1); - _curAttachment = [[_database attachmentWriter] retain]; + _curAttachment = [_database attachmentWriter]; // See whether the attachment name is in the headers. NSString* disposition = headers[@"Content-Disposition"]; @@ -271,7 +261,7 @@ - (void) finishedPart { } #endif _attachmentsByDigest[md5Str] = _curAttachment; - setObj(&_curAttachment, nil); + _curAttachment = nil; } } @@ -286,12 +276,12 @@ - (BOOL) parseJSONBuffer { if (![document isKindOfClass: [NSDictionary class]]) { Warn(@"%@: received unparseable JSON data '%@'", self, [_jsonBuffer my_UTF8ToString]); - setObj(&_jsonBuffer, nil); + _jsonBuffer = nil; _status = kTDStatusUpstreamError; return NO; } - setObj(&_jsonBuffer, nil); - _document = [document retain]; + _jsonBuffer = nil; + _document = document; return YES; } diff --git a/Source/TDMultipartDownloader.m b/Source/TDMultipartDownloader.m index 7d24891..c2f0ff0 100644 --- a/Source/TDMultipartDownloader.m +++ b/Source/TDMultipartDownloader.m @@ -52,10 +52,6 @@ - (void) setupRequest: (NSMutableURLRequest*)request withBody: (id)body { } -- (void) dealloc { - [_reader release]; - [super dealloc]; -} - (NSDictionary*) document { @@ -125,7 +121,7 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { urlStr = [urlStr stringByAppendingString: @"?revs=true&attachments=true"]; NSURL* url = [NSURL URLWithString: urlStr]; __block BOOL done = NO; - [[[[TDMultipartDownloader alloc] initWithURL: url + [[[TDMultipartDownloader alloc] initWithURL: url database: db requestHeaders: nil onCompletion: ^(id result, NSError * error) @@ -148,7 +144,7 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { } CAssertEq(db.attachmentStore.count, attachments.count); done = YES; - }] autorelease] start]; + }] start]; while (!done) [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate dateWithTimeIntervalSinceNow: 0.5]]; diff --git a/Source/TDMultipartReader.m b/Source/TDMultipartReader.m index 24d5d66..a256abf 100644 --- a/Source/TDMultipartReader.m +++ b/Source/TDMultipartReader.m @@ -60,7 +60,6 @@ - (id) initWithContentType: (NSString*)contentType self = [super init]; if (self) { if (![self parseContentType: contentType]) { - [self release]; return nil; } _delegate = delegate; @@ -72,28 +71,18 @@ - (id) initWithContentType: (NSString*)contentType - (void) close { - [_buffer release]; _buffer = nil; - [_headers release]; _headers = nil; - [_boundary release]; _boundary = nil; } -- (void)dealloc { - [self close]; - [_error release]; - [super dealloc]; -} - - - (BOOL) parseContentType: (NSString*)contentType { // ContentType will look like "multipart/foo; boundary=bar" // But there may be other ';'-separated params, and the boundary string may be quoted. // This is really not a full MIME type parser, but should work well enough for our needs. BOOL first = YES; - for (NSString* param in [contentType componentsSeparatedByString: @";"]) { + for (__strong NSString* param in [contentType componentsSeparatedByString: @";"]) { param = trim(param); if (first) { if (![param hasPrefix: @"multipart/"]) @@ -110,7 +99,7 @@ - (BOOL) parseContentType: (NSString*)contentType { if (boundary.length < 1) return NO; boundary = [@"\r\n--" stringByAppendingString: boundary]; - _boundary = [[boundary dataUsingEncoding: NSUTF8StringEncoding] retain]; + _boundary = [boundary dataUsingEncoding: NSUTF8StringEncoding]; break; } } @@ -127,7 +116,6 @@ - (BOOL) parseHeaders: (NSString*)headersStr { self.error = @"Unparseable UTF-8 in headers"; return NO; } - [_headers release]; _headers = [[NSMutableDictionary alloc] init]; BOOL first = YES; for (NSString* header in [headersStr componentsSeparatedByString: @"\r\n"]) { @@ -245,7 +233,6 @@ - (void) appendData: (NSData*)data { encoding: NSUTF8StringEncoding freeWhenDone: NO]; BOOL ok = [self parseHeaders: headers]; - [headers release]; if (!ok) return; // parseHeaders already set .error [self deleteUpThrough: r]; @@ -314,32 +301,25 @@ - (void) appendToPart: (NSData*)data { - (void) finishedPart { Assert(_currentPartData); - [_currentPartData release]; _currentPartData = nil; } -- (void)dealloc { - [_currentPartData release]; - [_partList release]; - [_headersList release]; - [super dealloc]; -} @end TestCase(TDMultipartReader_Types) { - TDMultipartReader* reader = [[[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=\"BOUNDARY\"" delegate: nil] autorelease]; + TDMultipartReader* reader = [[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=\"BOUNDARY\"" delegate: nil]; CAssertEqual(reader.boundary, [@"\r\n--BOUNDARY" dataUsingEncoding: NSUTF8StringEncoding]); - reader = [[[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=BOUNDARY" delegate: nil] autorelease]; + reader = [[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=BOUNDARY" delegate: nil]; CAssertEqual(reader.boundary, [@"\r\n--BOUNDARY" dataUsingEncoding: NSUTF8StringEncoding]); - reader = [[[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=\"BOUNDARY" delegate: nil] autorelease]; + reader = [[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=\"BOUNDARY" delegate: nil]; CAssertNil(reader); - reader = [[[TDMultipartReader alloc] initWithContentType: @"multipart/related;boundary=X" delegate: nil] autorelease]; + reader = [[TDMultipartReader alloc] initWithContentType: @"multipart/related;boundary=X" delegate: nil]; CAssertEqual(reader.boundary, [@"\r\n--X" dataUsingEncoding: NSUTF8StringEncoding]); } @@ -358,8 +338,8 @@ - (void)dealloc { for (NSUInteger chunkSize = 1; chunkSize <= mime.length; ++chunkSize) { Log(@"--- chunkSize = %u", (unsigned)chunkSize); - TestMultipartReaderDelegate* delegate = [[[TestMultipartReaderDelegate alloc] init] autorelease]; - TDMultipartReader* reader = [[[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=\"BOUNDARY\"" delegate: delegate] autorelease]; + TestMultipartReaderDelegate* delegate = [[TestMultipartReaderDelegate alloc] init]; + TDMultipartReader* reader = [[TDMultipartReader alloc] initWithContentType: @"multipart/related; boundary=\"BOUNDARY\"" delegate: delegate]; CAssert(!reader.finished); NSRange r = {0, 0}; diff --git a/Source/TDMultipartUploader.m b/Source/TDMultipartUploader.m index 64930f1..9dd2e89 100644 --- a/Source/TDMultipartUploader.m +++ b/Source/TDMultipartUploader.m @@ -30,7 +30,7 @@ - (id) initWithURL: (NSURL *)url requestHeaders: requestHeaders onCompletion: onCompletion]; if (self) { - _multipartWriter = [writer retain]; + _multipartWriter = writer; // It's important to set a Content-Length header -- without this, CFNetwork won't know the // length of the body stream, so it has to send the body chunked. But unfortunately CouchDB // doesn't correctly parse chunked multipart bodies: @@ -43,10 +43,6 @@ - (id) initWithURL: (NSURL *)url } -- (void)dealloc { - [_multipartWriter release]; - [super dealloc]; -} - (void) start { diff --git a/Source/TDMultipartWriter.m b/Source/TDMultipartWriter.m index fb0656e..24f9721 100644 --- a/Source/TDMultipartWriter.m +++ b/Source/TDMultipartWriter.m @@ -30,18 +30,13 @@ - (id) initWithContentType: (NSString*)type boundary: (NSString*)boundary { // Account for the final boundary to be written by -opened. Add its length now, because the // client is probably going to ask for my .length *before* it calls -open. NSString* finalBoundaryStr = $sprintf(@"\r\n--%@--", _boundary); - _finalBoundary = [[finalBoundaryStr dataUsingEncoding: NSUTF8StringEncoding] retain]; + _finalBoundary = [finalBoundaryStr dataUsingEncoding: NSUTF8StringEncoding]; _length += _finalBoundary.length; } return self; } -- (void)dealloc { - [_boundary release]; - [_finalBoundary release]; - [super dealloc]; -} @synthesize boundary=_boundary; @@ -53,7 +48,7 @@ - (NSString*) contentType { - (void) setNextPartsHeaders: (NSDictionary*)headers { - setObj(&_nextPartsHeaders, headers); + _nextPartsHeaders = headers; } @@ -69,7 +64,6 @@ - (void) addInput: (id)part length:(UInt64)length { [value replaceOccurrencesOfString: @"\n" withString: @"" options: 0 range: NSMakeRange(0, value.length)]; [headers appendFormat: @"%@: %@\r\n", name, value]; - [value release]; } [headers appendString: @"\r\n"]; NSData* separator = [headers dataUsingEncoding: NSUTF8StringEncoding]; @@ -85,7 +79,7 @@ - (void) opened { // Append the final boundary: [super addInput: _finalBoundary length: 0]; // _length was already adjusted for this in -init - setObj(&_finalBoundary, nil); + _finalBoundary = nil; } [super opened]; } @@ -108,8 +102,8 @@ - (void) openForURLRequest: (NSMutableURLRequest*)request; NSString* expectedOutput = @"\r\n--BOUNDARY\r\nContent-Length: 16\r\n\r\n\r\n--BOUNDARY\r\nContent-Length: 10\r\nContent-Type: something\r\n\r\n<2nd part>\r\n--BOUNDARY--"; RequireTestCase(TDMultiStreamWriter); for (unsigned bufSize = 1; bufSize < expectedOutput.length+1; ++bufSize) { - TDMultipartWriter* mp = [[[TDMultipartWriter alloc] initWithContentType: @"foo/bar" - boundary: @"BOUNDARY"] autorelease]; + TDMultipartWriter* mp = [[TDMultipartWriter alloc] initWithContentType: @"foo/bar" + boundary: @"BOUNDARY"]; CAssertEqual(mp.contentType, @"foo/bar; boundary=\"BOUNDARY\""); CAssertEqual(mp.boundary, @"BOUNDARY"); [mp addData: [@"" dataUsingEncoding: NSUTF8StringEncoding]]; diff --git a/Source/TDOAuth1Authorizer.m b/Source/TDOAuth1Authorizer.m index 5ce1a0d..fa6b8ec 100644 --- a/Source/TDOAuth1Authorizer.m +++ b/Source/TDOAuth1Authorizer.m @@ -34,7 +34,6 @@ - (id) initWithConsumerKey: (NSString*)consumerKey self = [super init]; if (self) { if (!consumerKey || !consumerSecret || !token || !tokenSecret) { - [self release]; return nil; } _consumer = [[OAConsumer alloc] initWithKey: consumerKey secret: consumerSecret]; @@ -45,7 +44,6 @@ - (id) initWithConsumerKey: (NSString*)consumerKey _signatureProvider = [[OAPlaintextSignatureProvider alloc] init]; else { Warn(@"Unsupported signature method '%@'", signatureMethod); - [self release]; return nil; } } @@ -53,13 +51,6 @@ - (id) initWithConsumerKey: (NSString*)consumerKey } -- (void)dealloc -{ - [_consumer release]; - [_token release]; - [_signatureProvider release]; - [super dealloc]; -} // TDAuthorizer API: @@ -75,25 +66,22 @@ - (NSString*) authorizeURLRequest: (NSMutableURLRequest*)request oarq.HTTPBody = request.HTTPBody; [oarq prepare]; NSString* authorization = [oarq valueForHTTPHeaderField: @"Authorization"]; - [oarq release]; return authorization; } -- (CFStringRef) authorizeHTTPMessage: (CFHTTPMessageRef)message - forRealm: (NSString*)realm +- (NSString*) authorizeHTTPMessage: (CFHTTPMessageRef)message + forRealm: (NSString*)realm { - NSURL* url = [(id)CFHTTPMessageCopyRequestURL(message) autorelease]; + NSURL* url = CFBridgingRelease(CFHTTPMessageCopyRequestURL(message)); OAMutableURLRequest* oarq = [[OAMutableURLRequest alloc] initWithURL: url consumer: _consumer token: _token realm: realm signatureProvider: _signatureProvider]; - oarq.HTTPMethod = [(id)CFHTTPMessageCopyRequestMethod(message) autorelease]; - oarq.HTTPBody = [(id)CFHTTPMessageCopyBody(message) autorelease]; + oarq.HTTPMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(message)); + oarq.HTTPBody = CFBridgingRelease(CFHTTPMessageCopyBody(message)); [oarq prepare]; - NSString* authorization = [oarq valueForHTTPHeaderField: @"Authorization"]; - [oarq release]; - return (CFStringRef)authorization; + return [oarq valueForHTTPHeaderField: @"Authorization"]; } @end diff --git a/Source/TDPuller.m b/Source/TDPuller.m index d53e482..1cfb765 100644 --- a/Source/TDPuller.m +++ b/Source/TDPuller.m @@ -56,13 +56,6 @@ @implementation TDPuller - (void)dealloc { [_changeTracker stop]; - [_changeTracker release]; - [_revsToPull release]; - [_deletedRevsToPull release]; - [_bulkRevsToPull release]; - [_downloadsToInsert release]; - [_pendingSequences release]; - [super dealloc]; } @@ -75,8 +68,6 @@ - (void) beginReplicating { [self insertDownloads: downloads]; }]; } - - [_pendingSequences release]; _pendingSequences = [[TDSequenceMap alloc] init]; _caughtUp = NO; @@ -125,10 +116,10 @@ - (void) stop { if (!_caughtUp) [self asyncTasksFinished: 1]; // balances -asyncTaskStarted in -beginReplicating } - setObj(&_changeTracker, nil); - setObj(&_revsToPull, nil); - setObj(&_deletedRevsToPull, nil); - setObj(&_bulkRevsToPull, nil); + _changeTracker = nil; + _revsToPull = nil; + _deletedRevsToPull = nil; + _bulkRevsToPull = nil; [super stop]; [_downloadsToInsert flushAll]; @@ -146,7 +137,7 @@ - (void) retry { - (void) stopped { - setObj(&_downloadsToInsert, nil); + _downloadsToInsert = nil; [super stopped]; } @@ -200,7 +191,6 @@ - (void) changeTrackerReceivedChanges: (NSArray*)changes { if (changes.count > 1) rev.conflicted = true; [self addToInbox: rev]; - [rev release]; changeCount++; } @@ -227,7 +217,6 @@ - (void) changeTrackerStopped:(TDChangeTracker *)tracker { NSError* error = tracker.error; LogTo(Sync, @"%@: ChangeTracker stopped; error=%@", self, error.description); - [_changeTracker release]; _changeTracker = nil; if (error) { @@ -298,10 +287,20 @@ - (void) processInbox: (TDRevisionList*)inbox { // Add a revision to the appropriate queue of revs to individually GET - (void) queueRemoteRevision: (TDRevision*)rev { - NSMutableArray** pQueue = (rev.deleted) ? &_deletedRevsToPull : &_revsToPull; - if (!*pQueue) - *pQueue = [[NSMutableArray alloc] initWithCapacity: 100]; - [*pQueue addObject: rev]; + if (rev.deleted) + { + if (!_deletedRevsToPull) + _deletedRevsToPull = [[NSMutableArray alloc] initWithCapacity:100]; + + [_deletedRevsToPull addObject:rev]; + } + else + { + if (!_revsToPull) + _revsToPull = [[NSMutableArray alloc] initWithCapacity:100]; + + [_revsToPull addObject:rev]; + } } @@ -354,33 +353,38 @@ - (void) pullRemoteRevision: (TDRevision*)rev LogTo(SyncVerbose, @"%@: GET .%@", self, path); NSString* urlStr = [_remote.absoluteString stringByAppendingString: path]; - __block TDMultipartDownloader* dl = [[[TDMultipartDownloader alloc] - initWithURL: [NSURL URLWithString: urlStr] - database: _db - requestHeaders: self.requestHeaders - onCompletion: + + // Under ARC, using variable dl directly in the block given as an argument to initWithURL:... + // results in compiler error (could be undefined variable) + __weak TDPuller *weakSelf = self; + __block TDMultipartDownloader *dl = nil; + dl = [[TDMultipartDownloader alloc] initWithURL: [NSURL URLWithString: urlStr] + database: _db + requestHeaders: self.requestHeaders + onCompletion: ^(TDMultipartDownloader* download, NSError *error) { + __strong TDPuller *strongSelf = weakSelf; // OK, now we've got the response revision: if (error) { - self.error = error; - [self revisionFailed]; - self.changesProcessed++; + strongSelf.error = error; + [strongSelf revisionFailed]; + strongSelf.changesProcessed++; } else { TDRevision* gotRev = [TDRevision revisionWithProperties: download.document]; gotRev.sequence = rev.sequence; // Add to batcher ... eventually it will be fed to -insertRevisions:. [_downloadsToInsert queueObject: gotRev]; - [self asyncTaskStarted]; + [strongSelf asyncTaskStarted]; } // Note that we've finished this task: - [self removeRemoteRequest: dl]; - [self asyncTasksFinished: 1]; + [strongSelf removeRemoteRequest:dl]; + [strongSelf asyncTasksFinished:1]; --_httpConnectionCount; // Start another task if there are still revisions waiting to be pulled: - [self pullRemoteRevisions]; + [strongSelf pullRemoteRevisions]; } - ] autorelease]; + ]; [self addRemoteRequest: dl]; dl.authorizer = _authorizer; [dl start]; @@ -398,7 +402,7 @@ - (void) pullBulkRevisions: (NSArray*)bulkRevs { [self asyncTaskStarted]; ++_httpConnectionCount; - NSMutableArray* remainingRevs = [[bulkRevs mutableCopy] autorelease]; + NSMutableArray* remainingRevs = [bulkRevs mutableCopy]; NSArray* keys = [bulkRevs my_map: ^(TDRevision* rev) { return rev.docID; }]; [self sendAsyncRequest: @"POST" path: @"/_all_docs?include_docs=true" @@ -521,10 +525,6 @@ @implementation TDPulledRevision @synthesize remoteSequenceID=_remoteSequenceID, conflicted=_conflicted; -- (void) dealloc { - [_remoteSequenceID release]; - [super dealloc]; -} @end diff --git a/Source/TDPusher.m b/Source/TDPusher.m index 5329688..07b2d93 100644 --- a/Source/TDPusher.m +++ b/Source/TDPusher.m @@ -132,7 +132,7 @@ - (BOOL) goOffline { - (void) stop { - setObj(&_uploaderQueue, nil); + _uploaderQueue = nil; _uploading = NO; [self stopObserving]; [super stop]; @@ -211,11 +211,11 @@ - (void) processInbox: (TDRevisionList*)changes { if (!_dontSendMultipart && [self uploadMultipartRevision: rev]) return nil; } - [properties retain]; // (to survive impending autorelease-pool drain) + // (to survive impending autorelease-pool drain) } lastInboxSequence = rev.sequence; Assert(properties[@"_id"]); - return [properties autorelease]; + return properties; }]; // Post the revisions to the destination: @@ -283,8 +283,8 @@ - (BOOL) uploadMultipartRevision: (TDRevision*)rev { if (attachment[@"follows"]) { if (!bodyStream) { // Create the HTTP multipart stream: - bodyStream = [[[TDMultipartWriter alloc] initWithContentType: @"multipart/related" - boundary: nil] autorelease]; + bodyStream = [[TDMultipartWriter alloc] initWithContentType: @"multipart/related" + boundary: nil]; [bodyStream setNextPartsHeaders: $dict({@"Content-Type", @"application/json"})]; // Use canonical JSON encoder so that _attachments keys will be written in the // same order that this for loop is processing the attachments. @@ -309,7 +309,7 @@ - (BOOL) uploadMultipartRevision: (TDRevision*)rev { NSString* path = $sprintf(@"/%@?new_edits=false", TDEscapeID(rev.docID)); NSString* urlStr = [_remote.absoluteString stringByAppendingString: path]; - __block TDMultipartUploader* uploader = [[[TDMultipartUploader alloc] + __block TDMultipartUploader* uploader = [[TDMultipartUploader alloc] initWithURL: [NSURL URLWithString: urlStr] streamer: bodyStream requestHeaders: self.requestHeaders @@ -335,7 +335,7 @@ - (BOOL) uploadMultipartRevision: (TDRevision*)rev { _uploading = NO; [self startNextUpload]; } - ] autorelease]; + ]; uploader.authorizer = _authorizer; [self addRemoteRequest: uploader]; LogTo(SyncVerbose, @"%@: Queuing %@ (multipart, %lldkb)", self, uploader, bodyStream.length/1024); diff --git a/Source/TDReachability.m b/Source/TDReachability.m index 9b8e2d2..16aa683 100644 --- a/Source/TDReachability.m +++ b/Source/TDReachability.m @@ -40,9 +40,8 @@ - (id) initWithHostName: (NSString*)hostName { hostName = @"localhost"; _hostName = [hostName copy]; _ref = SCNetworkReachabilityCreateWithName(NULL, [_hostName UTF8String]); - SCNetworkReachabilityContext context = {0, self}; + SCNetworkReachabilityContext context = {0, (__bridge void *)(self)}; if (!_ref || !SCNetworkReachabilitySetCallback(_ref, ClientCallback, &context)) { - [self release]; return nil; } } @@ -80,9 +79,6 @@ - (void)dealloc { [self stop]; CFRelease(_ref); } - [_onChange release]; - [_hostName release]; - [super dealloc]; } @@ -151,7 +147,7 @@ static void ClientCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) { - [(TDReachability*)info flagsChanged: flags]; + [(__bridge TDReachability*)info flagsChanged: flags]; } @@ -164,16 +160,19 @@ static void ClientCallback(SCNetworkReachabilityRef target, static void runReachability( NSString* hostname ) { Log(@"Test reachability of %@ ...", hostname); - TDReachability* r = [[[TDReachability alloc] initWithHostName: hostname] autorelease]; + TDReachability* r = [[TDReachability alloc] initWithHostName: hostname]; CAssert(r); Log(@"TDReachability = %@", r); CAssertEqual(r.hostName, hostname); __block BOOL resolved = NO; + + __weak TDReachability *weakR = r; r.onChange = ^{ + TDReachability *strongR = weakR; Log(@"onChange: known=%d, flags=%x --> reachable=%d", - r.reachabilityKnown, r.reachabilityFlags, r.reachable); - Log(@"TDReachability = %@", r); - if (r.reachabilityKnown) + strongR.reachabilityKnown, strongR.reachabilityFlags, strongR.reachable); + Log(@"TDReachability = %@", strongR); + if (strongR.reachabilityKnown) resolved = YES; }; CAssert([r start]); diff --git a/Source/TDReachability_Stubs.m b/Source/TDReachability_Stubs.m deleted file mode 100644 index e56dfec..0000000 --- a/Source/TDReachability_Stubs.m +++ /dev/null @@ -1,82 +0,0 @@ -// -// TDReachability_Stubs.m -// TouchDB -// -// Created by Jens Alfke on 2/28/12. -// Copyright (c) 2012 Couchbase, Inc. All rights reserved. -// - -#import "TDReachability.h" - - -@implementation TDReachability - - -- (id) initWithHostName: (NSString*)hostName { - Assert(hostName); - self = [super init]; - if (self) { - _hostName = [hostName copy]; - _reachabilityKnown = YES; - } - return self; -} - - -- (BOOL) start { - return YES; -} - - -- (void) stop { -} - - -- (void)dealloc { - [_onChange release]; - [_hostName release]; - [super dealloc]; -} - - -@synthesize hostName=_hostName, onChange=_onChange, - reachabilityKnown=_reachabilityKnown, reachabilityFlags=_reachabilityFlags; - - -- (NSString*) status { - if (!_reachabilityKnown) - return @"unknown"; - else if (!self.reachable) - return @"unreachable"; -#if TARGET_OS_IPHONE - else if (!self.reachableByWiFi) - return @"reachable (3G)"; -#endif - else - return @"reachable"; -} - -- (NSString*) description { - return $sprintf(@"<%@>:%@", _hostName, self.status); -} - - -- (BOOL) reachable { - return YES; -} - -- (BOOL) reachableByWiFi { - return self.reachable; -} - - -+ (NSSet*) keyPathsForValuesAffectingReachable { - return [NSSet setWithObjects: @"reachabilityKnown", @"reachabilityFlags", nil]; -} - -+ (NSSet*) keyPathsForValuesAffectingReachableByWiFi { - return [NSSet setWithObjects: @"reachabilityKnown", @"reachabilityFlags", nil]; -} - - -@end diff --git a/Source/TDRemoteRequest.h b/Source/TDRemoteRequest.h index cabd530..4035f65 100644 --- a/Source/TDRemoteRequest.h +++ b/Source/TDRemoteRequest.h @@ -41,7 +41,7 @@ typedef void (^TDRemoteRequestCompletionBlock)(id result, NSError* error); requestHeaders: (NSDictionary *)requestHeaders onCompletion: (TDRemoteRequestCompletionBlock)onCompletion; -@property (retain, nonatomic) idauthorizer; +@property (strong, nonatomic) idauthorizer; /** In some cases a kTDStatusNotFound Not Found is an expected condition and shouldn't be logged; call this to suppress that log message. */ - (void) dontLog404; diff --git a/Source/TDRemoteRequest.m b/Source/TDRemoteRequest.m index ee8576a..7b72669 100644 --- a/Source/TDRemoteRequest.m +++ b/Source/TDRemoteRequest.m @@ -70,9 +70,10 @@ - (id) initWithMethod: (NSString*)method } - (void) setAuthorizer: (id)authorizer { - if (ifSetObj(&_authorizer, authorizer)) { + if (_authorizer != authorizer) { + _authorizer = authorizer; [_request setValue: [authorizer authorizeURLRequest: _request forRealm: nil] - forHTTPHeaderField: @"Authorization"]; + forHTTPHeaderField: @"Authorization"]; } } @@ -92,31 +93,32 @@ - (void) start { return; // -clearConnection already called LogTo(RemoteRequest, @"%@: Starting...", self); Assert(!_connection); - _connection = [[NSURLConnection connectionWithRequest: _request delegate: self] retain]; + _connection = [NSURLConnection connectionWithRequest: _request delegate: self]; + // Retaining myself shouldn't be necessary, because NSURLConnection is documented as retaining // its delegate while it's running. But GNUstep doesn't (currently) do this, so for // compatibility I retain myself until the connection completes (see -clearConnection.) // TODO: Remove this and the [self autorelease] below when I get the fix from GNUstep. +#ifdef GNUSTEP [self retain]; +#endif } - (void) clearConnection { - [_request release]; _request = nil; if (_connection) { - [_connection autorelease]; _connection = nil; - [self autorelease]; // balances [self retain] in -start method + +#ifdef GNUSTEP + [self release]; +#endif } } - (void)dealloc { [self clearConnection]; - [_onCompletion release]; - [_authorizer release]; - [super dealloc]; } @@ -138,7 +140,6 @@ - (void) respondWithResult: (id)result error: (NSError*)error { - (void) startAfterDelay: (NSTimeInterval)delay { // assumes _connection already failed or canceled. - [_connection autorelease]; _connection = nil; [self performSelector: @selector(start) withObject: nil afterDelay: delay]; } @@ -154,7 +155,7 @@ - (void) stop { NSError* error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorCancelled userInfo: nil]; [self respondWithResult: nil error: error]; - [_onCompletion release]; // break cycles + // break cycles _onCompletion = nil; } } @@ -193,7 +194,7 @@ - (bool) retryWithCredential { } [_connection cancel]; - self.authorizer = [[[TDBasicAuthorizer alloc] initWithCredential: cred] autorelease]; + self.authorizer = [[TDBasicAuthorizer alloc] initWithCredential: cred]; LogTo(RemoteRequest, @"%@ retrying with %@", self, _authorizer); [self startAfterDelay: 0.0]; return true; @@ -252,13 +253,16 @@ + (BOOL) checkTrust: (SecTrustRef)trust forHost: (NSString*)host { CFRelease(subject); } #else +#ifdef __OBJC_GC__ NSArray* trustProperties = NSMakeCollectable(SecTrustCopyProperties(trust)); +#else + NSArray* trustProperties = (__bridge_transfer NSArray *)SecTrustCopyProperties(trust); +#endif for (NSDictionary* property in trustProperties) { Warn(@" %@: error = %@", - property[(id)kSecPropertyTypeTitle], - property[(id)kSecPropertyTypeError]); + property[(__bridge id)kSecPropertyTypeTitle], + property[(__bridge id)kSecPropertyTypeError]); } - [trustProperties release]; #endif return NO; } @@ -301,7 +305,7 @@ - (NSURLRequest *)connection:(NSURLConnection *)connection { // The redirected request needs to be authorized again: if (![request valueForHTTPHeaderField: @"Authorization"]) { - NSMutableURLRequest* nuRequest = [[request mutableCopy] autorelease]; + NSMutableURLRequest* nuRequest = [request mutableCopy]; NSString* auth; if (_authorizer) auth = [_authorizer authorizeURLRequest: nuRequest forRealm: nil]; @@ -362,7 +366,6 @@ - (void) setupRequest: (NSMutableURLRequest*)request withBody: (id)body { } - (void) clearConnection { - [_jsonBuffer release]; _jsonBuffer = nil; [super clearConnection]; } diff --git a/Source/TDReplicator.h b/Source/TDReplicator.h index b29796b..ac49b3c 100644 --- a/Source/TDReplicator.h +++ b/Source/TDReplicator.h @@ -24,7 +24,7 @@ extern NSString* TDReplicatorStoppedNotification; { @protected NSThread* _thread; - TDDatabase* _db; + TDDatabase* __weak _db; NSURL* _remote; TDReachability* _host; BOOL _continuous; @@ -56,7 +56,7 @@ extern NSString* TDReplicatorStoppedNotification; push: (BOOL)push continuous: (BOOL)continuous; -@property (readonly) TDDatabase* db; +@property (weak, readonly) TDDatabase* db; @property (readonly) NSURL* remote; @property (readonly) BOOL isPush; @property (readonly) BOOL continuous; @@ -67,7 +67,7 @@ extern NSString* TDReplicatorStoppedNotification; /** Optional dictionary of headers to be added to all requests to remote servers. */ @property (copy) NSDictionary* requestHeaders; -@property (retain) id authorizer; +@property (strong) id authorizer; /** Starts the replicator. Replicators run asynchronously so nothing will happen until later. @@ -91,7 +91,7 @@ extern NSString* TDReplicatorStoppedNotification; /** Latest error encountered while replicating. This is set to nil when starting. It may also be set to nil by the client if desired. Not all errors are fatal; if .running is still true, the replicator will retry. */ -@property (retain, nonatomic) NSError* error; +@property (strong, nonatomic) NSError* error; /** A unique-per-process string identifying this replicator instance. */ @property (copy, nonatomic) NSString* sessionID; diff --git a/Source/TDReplicator.m b/Source/TDReplicator.m index ff07bcc..98f1975 100644 --- a/Source/TDReplicator.m +++ b/Source/TDReplicator.m @@ -75,7 +75,6 @@ - (id) initWithDB: (TDDatabase*)db // TDReplicator is an abstract class; instantiating one actually instantiates a subclass. if ([self class] == [TDReplicator class]) { - [self release]; Class klass = push ? [TDPusher class] : [TDPuller class]; return [[klass alloc] initWithDB: db remote: remote push: push continuous: continuous]; } @@ -84,7 +83,7 @@ - (id) initWithDB: (TDDatabase*)db if (self) { _thread = [NSThread currentThread]; _db = db; - _remote = [remote retain]; + _remote = remote; _continuous = continuous; Assert(push == self.isPush); @@ -98,21 +97,7 @@ - (id) initWithDB: (TDDatabase*)db - (void)dealloc { [self stop]; [[NSNotificationCenter defaultCenter] removeObserver: self]; - [_remote release]; [_host stop]; - [_host release]; - [_filterName release]; - [_filterParameters release]; - [_lastSequence release]; - [_remoteCheckpoint release]; - [_batcher release]; - [_sessionID release]; - [_error release]; - [_authorizer release]; - [_options release]; - [_requestHeaders release]; - [_remoteRequests release]; - [super dealloc]; } @@ -160,7 +145,6 @@ - (void) setLastSequence:(NSString*)lastSequence { if (!$equal(lastSequence, _lastSequence)) { LogTo(SyncVerbose, @"%@: Setting lastSequence to %@ (from %@)", self, lastSequence, _lastSequence); - [_lastSequence release]; _lastSequence = [lastSequence copy]; if (!_lastSequenceChanged) { _lastSequenceChanged = YES; @@ -198,8 +182,11 @@ - (void) setError:(NSError *)error { if (error.code == NSURLErrorCancelled && $equal(error.domain, NSURLErrorDomain)) return; - if (ifSetObj(&_error, error)) + if (_error != error) + { + _error = error; [self postProgressChanged]; + } } @@ -218,7 +205,6 @@ - (void) start { self, (unsigned)inbox.count); TDRevisionList* revs = [[TDRevisionList alloc] initWithArray: inbox]; [self processInbox: revs]; - [revs release]; LogTo(SyncVerbose, @"*** %@: END processInbox (lastSequence=%@)", self, _lastSequence); [self updateActive]; } @@ -238,7 +224,12 @@ - (void) start { // the block also retains a ref to self. Cycle is also broken in -stopped.) _online = NO; _host = [[TDReachability alloc] initWithHostName: _remote.host]; - _host.onChange = ^{[self reachabilityChanged: _host];}; + + __weak id weakSelf = self; + _host.onChange = ^{ + TDReplicator *strongSelf = weakSelf; + [strongSelf reachabilityChanged:strongSelf->_host]; + }; [_host start]; [self reachabilityChanged: _host]; } @@ -278,9 +269,10 @@ - (void) stopped { [[NSNotificationCenter defaultCenter] postNotificationName: TDReplicatorStoppedNotification object: self]; [self saveLastSequence]; - setObj(&_batcher, nil); + + _batcher = nil; [_host stop]; - setObj(&_host, nil); + _host = nil; [self clearDbRef]; // _db no longer tracks me so it won't notify me when it closes; clear ref now } @@ -324,7 +316,6 @@ - (BOOL) goOnline { _online = YES; if (_running) { - [_lastSequence release]; _lastSequence = nil; self.error = nil; @@ -431,20 +422,24 @@ - (TDRemoteJSONRequest*) sendAsyncRequest: (NSString*)method LogTo(SyncVerbose, @"%@: %@ .%@", self, method, relativePath); NSString* urlStr = [_remote.absoluteString stringByAppendingString: relativePath]; NSURL* url = [NSURL URLWithString: urlStr]; - onCompletion = [[onCompletion copy] autorelease]; - __block TDRemoteJSONRequest *req = [[TDRemoteJSONRequest alloc] initWithMethod: method - URL: url - body: body - requestHeaders: self.requestHeaders - onCompletion: - ^(id result, NSError* error) { - [self removeRemoteRequest: req]; - onCompletion(result, error); - }]; + onCompletion = [onCompletion copy]; + + // under ARC, using variable req used directly inside the block results in a compiler error (it could have undefined value). + __weak TDReplicator *weakSelf = self; + __block TDRemoteJSONRequest *req = nil; + req = [[TDRemoteJSONRequest alloc] initWithMethod: method + URL: url + body: body + requestHeaders: self.requestHeaders + onCompletion: ^(id result, NSError* error) { + TDReplicator *strongSelf = weakSelf; + [strongSelf removeRemoteRequest: req]; + onCompletion(result, error); + }]; req.authorizer = _authorizer; [self addRemoteRequest: req]; [req start]; - return [req autorelease]; + return req; } @@ -466,7 +461,7 @@ - (void) stopRemoteRequests { // Clear _remoteRequests before iterating, to ensure that re-entrant calls to this won't // try to re-stop any of the requests. (Re-entrant calls are possible due to replicator // error handling when it receives the 'canceled' errors from the requests I'm stopping.) - NSArray* requests = [_remoteRequests autorelease]; + NSArray* requests = _remoteRequests; _remoteRequests = nil; [requests makeObjectsPerformSelector: @selector(stop)]; } @@ -523,7 +518,7 @@ - (void) fetchRemoteCheckpointDoc { response[@"lastSequence"]); if ($equal(remoteLastSequence, localLastSequence)) { - _lastSequence = [localLastSequence retain]; + _lastSequence = localLastSequence; LogTo(Sync, @"%@: Replicating from lastSequence=%@", self, _lastSequence); } else { LogTo(Sync, @"%@: lastSequence mismatch: I had %@, remote had %@", @@ -555,7 +550,7 @@ - (void) saveLastSequence { _lastSequenceChanged = _overdueForSave = NO; LogTo(Sync, @"%@ checkpointing sequence=%@", self, _lastSequence); - NSMutableDictionary* body = [[_remoteCheckpoint mutableCopy] autorelease]; + NSMutableDictionary* body = [_remoteCheckpoint mutableCopy]; if (!body) body = $mdict(); [body setValue: _lastSequence forKey: @"lastSequence"]; diff --git a/Source/TDReplicatorManager.m b/Source/TDReplicatorManager.m index 1e8f4d8..e574a75 100644 --- a/Source/TDReplicatorManager.m +++ b/Source/TDReplicatorManager.m @@ -50,9 +50,8 @@ - (id) initWithDatabaseManager: (TDDatabaseManager*)dbManager { self = [super init]; if (self) { _dbManager = dbManager; - _replicatorDB = [[dbManager databaseNamed: kTDReplicatorDatabaseName] retain]; + _replicatorDB = [dbManager databaseNamed: kTDReplicatorDatabaseName]; if (!_replicatorDB) { - [self release]; return nil; } Assert(_replicatorDB); @@ -64,8 +63,6 @@ - (id) initWithDatabaseManager: (TDDatabaseManager*)dbManager { - (void)dealloc { [self stop]; - [_replicatorDB release]; - [super dealloc]; } @@ -95,7 +92,6 @@ - (void) stop { LogTo(TDServer, @"STOP %@", self); [_replicatorDB defineValidation: @"TDReplicatorManager" asBlock: nil]; [[NSNotificationCenter defaultCenter] removeObserver: self]; - [_replicatorsByDocID release]; _replicatorsByDocID = nil; } @@ -179,12 +175,11 @@ - (TDStatus) parseReplicatorProperties: (NSDictionary*)properties NSString* token = $castIf(NSString, oauth[@"token"]); NSString* tokenSec = $castIf(NSString, oauth[@"token_secret"]); NSString* sigMethod = $castIf(NSString, oauth[@"signature_method"]); - *outAuthorizer = [[[TDOAuth1Authorizer alloc] initWithConsumerKey: consumerKey + *outAuthorizer = [[TDOAuth1Authorizer alloc] initWithConsumerKey: consumerKey consumerSecret: consumerSec token: token tokenSecret: tokenSec - signatureMethod: sigMethod] - autorelease]; + signatureMethod: sigMethod]; if (!*outAuthorizer) return kTDStatusBadRequest; } @@ -266,7 +261,7 @@ - (TDStatus) updateDoc: (TDRevision*)currentRev do { // Create an updated revision by merging in the updates: NSDictionary* currentProperties = currentRev.properties; - NSMutableDictionary* updatedProperties = [[currentProperties mutableCopy] autorelease]; + NSMutableDictionary* updatedProperties = [currentProperties mutableCopy]; [updatedProperties addEntriesFromDictionary: updates]; if ($equal(updatedProperties, currentProperties)) { status = kTDStatusOK; // this is a no-op change @@ -503,7 +498,6 @@ - (void) someDbDeleted: (NSNotification*)n { allowConflict: NO status: &status]) { Warn(@"TDReplicatorManager: Couldn't delete replication doc %@", docProps); } - [delRev release]; } } } diff --git a/Source/TDReplicator_Tests.m b/Source/TDReplicator_Tests.m index 47c73e2..29450d4 100644 --- a/Source/TDReplicator_Tests.m +++ b/Source/TDReplicator_Tests.m @@ -59,7 +59,7 @@ static void deleteRemoteDB(void) { onCompletion: ^(id result, NSError *err) { finished = YES; - error = [err retain]; + error = err; } ]; request.authorizer = authorizer(); @@ -68,16 +68,14 @@ static void deleteRemoteDB(void) { while (!finished && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: timeout]) ; - [request release]; CAssert(error == nil || error.code == kTDStatusNotFound, @"Couldn't delete remote: %@", error); - [error release]; } static NSString* replic8(TDDatabase* db, NSString* urlStr, BOOL push, NSString* filter) { NSURL* remote = [NSURL URLWithString: urlStr]; - TDReplicator* repl = [[[TDReplicator alloc] initWithDB: db remote: remote - push: push continuous: NO] autorelease]; + TDReplicator* repl = [[TDReplicator alloc] initWithDB: db remote: remote + push: push continuous: NO]; if (push) ((TDPusher*)repl).createTarget = YES; repl.filterName = filter; @@ -257,7 +255,7 @@ static void deleteRemoteDB(void) { CAssert(repl.running); // Delete the _replication_state property: - NSMutableDictionary* updatedProps = [[newRev.properties mutableCopy] autorelease]; + NSMutableDictionary* updatedProps = [newRev.properties mutableCopy]; [updatedProps removeObjectForKey: @"_replication_state"]; rev = [TDRevision revisionWithProperties: updatedProps]; rev = [replicatorDb putRevision: rev prevRevisionID: rev.revID allowConflict: NO status: &status]; @@ -311,7 +309,7 @@ static void deleteRemoteDB(void) { CAssertEqual(remote, $url(@"http://example.com")); CAssertEq(isPush, YES); CAssertEq(createTarget, YES); - CAssertEq(headers, nil); + CAssertEqual(headers, nil); props = $dict({@"source", @"touchdb:///foo"}, {@"target", @"foo"}); @@ -326,7 +324,7 @@ static void deleteRemoteDB(void) { CAssertEqual(remote, $url(@"touchdb:///foo")); CAssertEq(isPush, NO); CAssertEq(createTarget, NO); - CAssertEq(headers, nil); + CAssertEqual(headers, nil); NSDictionary* oauthDict = $dict({@"consumer_secret", @"consumer_secret"}, {@"consumer_key", @"consumer_key"}, diff --git a/Source/TDRevision.h b/Source/TDRevision.h index e63ca61..99df610 100644 --- a/Source/TDRevision.h +++ b/Source/TDRevision.h @@ -38,7 +38,7 @@ typedef SInt64 SequenceNumber; @property (readonly) bool deleted; @property bool missing; -@property (retain) TDBody* body; +@property (strong) TDBody* body; @property (copy) NSDictionary* properties; @property (copy) NSData* asJSON; diff --git a/Source/TDRevision.m b/Source/TDRevision.m index db54e0f..9ed3616 100644 --- a/Source/TDRevision.m +++ b/Source/TDRevision.m @@ -28,7 +28,6 @@ - (id) initWithDocID: (NSString*)docID if (self) { if (!docID && (revID || deleted)) { // Illegal rev - [self release]; return nil; } _docID = docID.copy; @@ -50,24 +49,17 @@ - (id) initWithBody: (TDBody*)body { } - (id) initWithProperties: (NSDictionary*)properties { - TDBody* body = [[[TDBody alloc] initWithProperties: properties] autorelease]; + TDBody* body = [[TDBody alloc] initWithProperties: properties]; if (!body) { - [self release]; return nil; } return [self initWithBody: body]; } + (TDRevision*) revisionWithProperties: (NSDictionary*)properties { - return [[[self alloc] initWithProperties: properties] autorelease]; + return [[self alloc] initWithProperties: properties]; } -- (void)dealloc { - [_docID release]; - [_revID release]; - [_body release]; - [super dealloc]; -} @synthesize docID=_docID, revID=_revID, deleted=_deleted, missing=_missing, body=_body, sequence=_sequence; @@ -99,7 +91,6 @@ + (BOOL) parseRevID: (NSString*)revID intoGeneration: (int*)outNum andSuffix:(NS BOOL parsed = [scanner scanInt: outNum] && [scanner scanString: @"-" intoString: NULL]; if (outSuffix) *outSuffix = [revID substringFromIndex: scanner.scanLocation]; - [scanner release]; return parsed && *outNum > 0 && (!outSuffix || (*outSuffix).length > 0); } @@ -153,7 +144,6 @@ - (TDRevision*) copyWithDocID: (NSString*)docID revID: (NSString*)revID { [nuProperties setValue: docID forKey: @"_id"]; [nuProperties setValue: revID forKey: @"_rev"]; rev.properties = nuProperties; - [nuProperties release]; return rev; } @@ -182,10 +172,6 @@ - (id) initWithArray: (NSArray*)revs { return self; } -- (void)dealloc { - [_revs release]; - [super dealloc]; -} - (NSString*) description { return _revs.description; diff --git a/Source/TDRouter+Handlers.m b/Source/TDRouter+Handlers.m index 6ecaa2f..b493acf 100644 --- a/Source/TDRouter+Handlers.m +++ b/Source/TDRouter+Handlers.m @@ -53,7 +53,7 @@ - (TDStatus) do_GETRoot { - (TDStatus) do_GET_all_dbs { NSArray* dbs = _dbManager.allDatabaseNames ?: @[]; - _response.body = [[[TDBody alloc] initWithArray: dbs] autorelease]; + _response.body = [[TDBody alloc] initWithArray: dbs]; return kTDStatusOK; } @@ -155,7 +155,7 @@ - (TDStatus) do_GET_active_tasks { {@"error", error})]; } } - _response.body = [[[TDBody alloc] initWithArray: activity] autorelease]; + _response.body = [[TDBody alloc] initWithArray: activity]; return kTDStatusOK; } @@ -279,7 +279,7 @@ - (TDStatus) do_POST_bulk_docs: (TDDatabase*)db { TDStatus status; TDBody* docBody = [TDBody bodyWithProperties: doc]; if (noNewEdits) { - rev = [[[TDRevision alloc] initWithBody: docBody] autorelease]; + rev = [[TDRevision alloc] initWithBody: docBody]; NSArray* history = [TDDatabase parseCouchDBRevisionHistory: doc]; status = rev ? [db forceInsert: rev revisionHistory: history source: nil] : kTDStatusBadParam; } else { @@ -321,7 +321,7 @@ - (TDStatus) do_POST_bulk_docs: (TDDatabase*)db { - (TDStatus) do_POST_revs_diff: (TDDatabase*)db { // http://wiki.apache.org/couchdb/HttpPostRevsDiff // Collect all of the input doc/revision IDs as TDRevisions: - TDRevisionList* revs = [[[TDRevisionList alloc] init] autorelease]; + TDRevisionList* revs = [[TDRevisionList alloc] init]; NSDictionary* body = self.bodyAsDictionary; if (!body) return kTDStatusBadJSON; @@ -332,7 +332,6 @@ - (TDStatus) do_POST_revs_diff: (TDDatabase*)db { for (NSString* revID in revIDs) { TDRevision* rev = [[TDRevision alloc] initWithDocID: docID revID: revID deleted: NO]; [revs addRev: rev]; - [rev release]; } } @@ -366,7 +365,6 @@ - (TDStatus) do_POST_revs_diff: (TDDatabase*)db { } TDRevision* rev = [[TDRevision alloc] initWithDocID: docID revID: maxRevID deleted: NO]; NSArray* ancestors = [_db getPossibleAncestorRevisionIDs: rev limit: 0]; - [rev release]; if (ancestors) docInfo[@"possible_ancestors"] = ancestors; } @@ -442,7 +440,6 @@ - (void) sendContinuousChange: (TDRevision*)rev { [json appendBytes: "\n" length: 1]; if (_onDataAvailable) _onDataAvailable(json, NO); - [json release]; } @@ -506,7 +503,7 @@ - (TDStatus) do_GET_changes: (TDDatabase*)db { NSString* filterName = [self query: @"filter"]; if (filterName) { - _changesFilter = [[_db filterNamed: filterName] retain]; + _changesFilter = [_db filterNamed: filterName]; if (!_changesFilter) return kTDStatusNotFound; _changesFilterParams = [self.jsonQueries copy]; @@ -739,8 +736,7 @@ - (TDStatus) update: (TDDatabase*)db if (!prevRevID) prevRevID = self.ifMatch; - TDRevision* rev = [[[TDRevision alloc] initWithDocID: docID revID: nil deleted: deleting] - autorelease]; + TDRevision* rev = [[TDRevision alloc] initWithDocID: docID revID: nil deleted: deleting]; if (!rev) return kTDStatusBadID; rev.body = body; @@ -787,7 +783,7 @@ - (TDStatus) readDocumentBodyThen: (TDStatus(^)(TDBody*))block { NSString* contentType = [_request valueForHTTPHeaderField: @"Content-Type"]; NSInputStream* bodyStream = _request.HTTPBodyStream; if (bodyStream) { - block = [[block copy] autorelease]; + block = [block copy]; status = [TDMultipartDocumentReader readStream: bodyStream ofType: contentType toDatabase: _db @@ -841,7 +837,7 @@ - (TDStatus) do_PUT: (TDDatabase*)db docID: (NSString*)docID { return [self update: db docID: docID body: body deleting: NO]; } else { // PUT with new_edits=false -- forcible insertion of existing revision: - TDRevision* rev = [[[TDRevision alloc] initWithBody: body] autorelease]; + TDRevision* rev = [[TDRevision alloc] initWithBody: body]; if (!rev) return kTDStatusBadJSON; if (!$equal(rev.docID, docID) || !rev.revID) diff --git a/Source/TDRouter.h b/Source/TDRouter.h index 0b170f4..4338c6c 100644 --- a/Source/TDRouter.h +++ b/Source/TDRouter.h @@ -97,8 +97,8 @@ typedef void (^OnFinishedBlock)(); @property (nonatomic) int status; @property (nonatomic, readonly) NSString* statusMsg; @property (nonatomic, copy) NSString* statusReason; -@property (nonatomic, retain) NSMutableDictionary* headers; -@property (nonatomic, retain) TDBody* body; +@property (nonatomic, strong) NSMutableDictionary* headers; +@property (nonatomic, strong) TDBody* body; @property (nonatomic, copy) id bodyObject; @property (nonatomic, readonly) NSString* baseContentType; diff --git a/Source/TDRouter.m b/Source/TDRouter.m index f792fe1..a4e2010 100644 --- a/Source/TDRouter.m +++ b/Source/TDRouter.m @@ -55,13 +55,15 @@ - (id) initWithDatabaseManager: (TDDatabaseManager*)dbManager request: (NSURLReq NSParameterAssert(request); self = [super init]; if (self) { - _dbManager = [dbManager retain]; - _request = [request retain]; + _dbManager = dbManager; + _request = request; _response = [[TDResponse alloc] init]; _local = YES; _processRanges = YES; if (0) { // assignments just to appease static analyzer so it knows these ivars are used _longpoll = _changesIncludeDocs = _changesIncludeConflicts = NO; + _changesFilter = NULL; + _changesFilterParams = nil; } } return self; @@ -75,7 +77,7 @@ - (id) initWithServer: (TDServer*)server NSParameterAssert(request); self = [self initWithDatabaseManager: nil request: request]; if (self) { - _server = [server retain]; + _server = server; _local = isLocal; _processRanges = YES; } @@ -84,20 +86,6 @@ - (id) initWithServer: (TDServer*)server - (void)dealloc { [self stopNow]; - [_dbManager release]; - [_server release]; - [_request release]; - [_response release]; - [_queries release]; - [_path release]; - [_db release]; - [_changesFilter release]; - [_changesFilterParams release]; - [_onAccessCheck release]; - [_onResponseReady release]; - [_onDataAvailable release]; - [_onFinished release]; - [super dealloc]; } @@ -263,7 +251,11 @@ - (TDStatus) openDB { #ifdef GNUSTEP NSString* pathString = [url pathWithEscapes]; #else + #ifdef __OBJC_GC__ NSString* pathString = NSMakeCollectable(CFURLCopyPath((CFURLRef)url)); + #else + NSString* pathString = (__bridge_transfer NSString *)CFURLCopyPath((__bridge CFURLRef)url); + #endif #endif NSMutableArray* path = $marray(); for (NSString* comp in [pathString componentsSeparatedByString: @"/"]) { @@ -277,7 +269,6 @@ - (TDStatus) openDB { } } #ifndef GNUSTEP - [pathString release]; #endif return path; } @@ -307,7 +298,7 @@ - (TDStatus) route { } else if (!validName) { return kTDStatusBadID; } else { - _db = [[_dbManager databaseNamed: dbName] retain]; + _db = [_dbManager databaseNamed: dbName]; if (!_db) return kTDStatusNotFound; [message appendString: @":"]; @@ -463,7 +454,7 @@ - (void) processRequestRanges { // Parse the header value into 'from' and 'to' range strings: static NSRegularExpression* regex; if (!regex) - regex = [$regex(@"^bytes=(\\d+)?-(\\d+)?$") retain]; + regex = $regex(@"^bytes=(\\d+)?-(\\d+)?$"); NSTextCheckingResult *match = [regex firstMatchInString: rangeHeader options: 0 range: NSMakeRange(0, rangeHeader.length)]; if (!match) { @@ -565,11 +556,10 @@ - (void) finished { [output appendFormat: @"\n\t%@: %@", key, headers[key]]; LogTo(TDRouter, @"%@", output); } - OnFinishedBlock onFinished = [_onFinished retain]; + OnFinishedBlock onFinished = _onFinished; [self stopNow]; if (onFinished) onFinished(); - [onFinished release]; } @@ -596,7 +586,7 @@ - (void) start { [self run]; } else { [_server tellDatabaseManager: ^(TDDatabaseManager* dbm) { - _dbManager = [dbm retain]; + _dbManager = dbm; [self run]; }]; } @@ -635,17 +625,10 @@ - (id) init return self; } -- (void)dealloc { - [_statusMsg release]; - [_statusReason release]; - [_headers release]; - [_body release]; - [super dealloc]; -} - (void) reset { [_headers removeAllObjects]; - setObj(&_body, nil); + _body = nil; } @synthesize status=_status, internalStatus=_internalStatus, statusMsg=_statusMsg, @@ -655,7 +638,7 @@ - (void) setInternalStatus:(TDStatus)internalStatus { _internalStatus = internalStatus; NSString* statusMsg; self.status = TDStatusToHTTPStatus(internalStatus, &statusMsg); - setObjCopy(&_statusMsg, statusMsg); + _statusMsg = statusMsg; if (_status < 300) { if (!_body && !_headers[@"Content-Type"]) { self.body = [TDBody bodyWithJSON: @@ -704,7 +687,7 @@ - (void) setMultipartBody: (TDMultipartWriter*)mp { - (void) setMultipartBody: (NSArray*)parts type: (NSString*)type { TDMultipartWriter* mp = [[TDMultipartWriter alloc] initWithContentType: type boundary: nil]; - for (id part in parts) { + for (__strong id part in parts) { if (![part isKindOfClass: [NSData class]]) { part = [TDJSON dataWithJSONObject: part options: 0 error: NULL]; [mp setNextPartsHeaders: $dict({@"Content-Type", @"application/json"})]; @@ -712,7 +695,6 @@ - (void) setMultipartBody: (NSArray*)parts type: (NSString*)type { [mp addData: part]; } [self setMultipartBody: mp]; - [mp release]; } @end diff --git a/Source/TDRouter_Tests.m b/Source/TDRouter_Tests.m index f9965c7..e5f5ec7 100644 --- a/Source/TDRouter_Tests.m +++ b/Source/TDRouter_Tests.m @@ -49,7 +49,7 @@ CAssertNil(error); } } - TDRouter* router = [[[TDRouter alloc] initWithDatabaseManager: server request: request] autorelease]; + TDRouter* router = [[TDRouter alloc] initWithDatabaseManager: server request: request]; CAssert(router!=nil); __block TDResponse* response = nil; __block NSUInteger dataLength = 0; @@ -69,7 +69,7 @@ static id ParseJSONResponse(TDResponse* response) { NSString* jsonStr = nil; id result = nil; if (json) { - jsonStr = [[[NSString alloc] initWithData: json encoding: NSUTF8StringEncoding] autorelease]; + jsonStr = [[NSString alloc] initWithData: json encoding: NSUTF8StringEncoding]; CAssert(jsonStr); NSError* error; result = [TDJSON JSONObjectWithData: json options: 0 error: &error]; @@ -359,7 +359,7 @@ static void CheckCacheable(TDDatabaseManager* server, NSString* path) { SendBody(server, @"PUT", @"/db/doc1", $dict({@"message", @"hello"}), kTDStatusCreated, nil); __block TDResponse* response = nil; - __block NSMutableData* body = [NSMutableData data]; + __weak NSMutableData* body = [NSMutableData data]; __block BOOL finished = NO; NSURL* url = [NSURL URLWithString: @"touchdb:///db/_changes?feed=continuous"]; @@ -395,7 +395,6 @@ static void CheckCacheable(TDDatabaseManager* server, NSString* path) { CAssert(!finished); [router stop]; - [router release]; [server close]; } @@ -669,7 +668,7 @@ static void CheckCacheable(TDDatabaseManager* server, NSString* path) { NSURL* url = [NSURL URLWithString: @"touchdb:///db/"]; NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL: url]; request.HTTPMethod = @"GET"; - TDRouter* router = [[[TDRouter alloc] initWithDatabaseManager: server request: request] autorelease]; + TDRouter* router = [[TDRouter alloc] initWithDatabaseManager: server request: request]; CAssert(router!=nil); __block BOOL calledOnAccessCheck = NO; router.onAccessCheck = ^TDStatus(TDDatabase* accessDB, NSString* docID, SEL action) { @@ -681,7 +680,7 @@ static void CheckCacheable(TDDatabaseManager* server, NSString* path) { CAssert(calledOnAccessCheck); CAssert(router.response.status == 200); - router = [[[TDRouter alloc] initWithDatabaseManager: server request: request] autorelease]; + router = [[TDRouter alloc] initWithDatabaseManager: server request: request]; CAssert(router!=nil); calledOnAccessCheck = NO; router.onAccessCheck = ^TDStatus(TDDatabase* accessDB, NSString* docID, SEL action) { diff --git a/Source/TDSequenceMap.m b/Source/TDSequenceMap.m index 24e985f..37e4349 100644 --- a/Source/TDSequenceMap.m +++ b/Source/TDSequenceMap.m @@ -31,12 +31,6 @@ - (id)init } -- (void)dealloc -{ - [_sequences release]; - [_values release]; - [super dealloc]; -} - (SequenceNumber) addValue: (id)value { @@ -83,7 +77,7 @@ - (id) checkpointedValue { TestCase(TDSequenceMap) { - TDSequenceMap* map = [[[TDSequenceMap alloc] init] autorelease]; + TDSequenceMap* map = [[TDSequenceMap alloc] init]; CAssertEq(map.checkpointedSequence, 0); CAssertEqual(map.checkpointedValue, nil); CAssert(map.isEmpty); diff --git a/Source/TDServer.m b/Source/TDServer.m index 04b4ea2..4d651ca 100644 --- a/Source/TDServer.m +++ b/Source/TDServer.m @@ -33,7 +33,7 @@ + (TDServer*) createEmptyAtPath: (NSString*)path { TDServer* server = [[self alloc] initWithDirectory: path error: &error]; Assert(server, @"Failed to create server at %@: %@", path, error); AssertEqual(server.directory, path); - return [server autorelease]; + return server; } + (TDServer*) createEmptyAtTemporaryPath: (NSString*)name { @@ -53,7 +53,6 @@ - (id) initWithDirectory: (NSString*)dirPath options: options error: outError]; if (!_manager) { - [self release]; return nil; } @@ -75,8 +74,6 @@ - (void)dealloc { LogTo(TDServer, @"DEALLOC"); if (_serverThread) Warn(@"%@ dealloced with _serverThread still set: %@", self, _serverThread); - [_manager release]; - [super dealloc]; } @@ -87,7 +84,6 @@ - (void) close { [TDURLProtocol unregisterServer: self]; _stopRunLoop = YES; }]; - [_serverThread release]; _serverThread = nil; } } @@ -100,24 +96,20 @@ - (NSString*) directory { - (void) runServerThread { @autoreleasepool { - [[self retain] autorelease]; // ensure self stays alive till this method returns - - @autoreleasepool { - LogTo(TDServer, @"Server thread starting..."); + LogTo(TDServer, @"Server thread starting..."); - [[NSThread currentThread] setName:@"TouchDB"]; - + [[NSThread currentThread] setName:@"TouchDB"]; + #ifndef GNUSTEP - // Add a no-op source so the runloop won't stop on its own: - CFRunLoopSourceContext context = {}; // all zeros - CFRunLoopSourceRef source = CFRunLoopSourceCreate(NULL, 0, &context); - CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); - CFRelease(source); + // Add a no-op source so the runloop won't stop on its own: + CFRunLoopSourceContext context = {}; // all zeros + CFRunLoopSourceRef source = CFRunLoopSourceCreate(NULL, 0, &context); + CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); + CFRelease(source); #endif - // Initialize the replicator, if it's enabled: - [_manager replicatorManager]; - } + // Initialize the replicator, if it's enabled: + [_manager replicatorManager]; // Now run: while (!_stopRunLoop && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode @@ -154,8 +146,8 @@ - (void) tellDatabaseManager: (void (^)(TDDatabaseManager*))block { NSURL* TDStartServer(NSString* serverDirectory, NSError** outError) { CAssert(![TDURLProtocol server], @"A TDServer is already running"); - TDServer* tdServer = [[[TDServer alloc] initWithDirectory: serverDirectory - error: outError] autorelease]; + TDServer* tdServer = [[TDServer alloc] initWithDirectory: serverDirectory + error: outError]; if (!tdServer) return nil; return [TDURLProtocol registerServer: tdServer forHostname: nil]; diff --git a/Source/TDStatus.m b/Source/TDStatus.m index 0e98f9b..5579b9c 100644 --- a/Source/TDStatus.m +++ b/Source/TDStatus.m @@ -22,27 +22,27 @@ struct StatusMapEntry { TDStatus status; int httpStatus; - NSString* message; + const char* message; }; static const struct StatusMapEntry kStatusMap[] = { - {kTDStatusNotFound, 404, @"not_found"}, // for compatibility with CouchDB - {kTDStatusDuplicate, 412, @"Already exists"}, // really 'Precondition Failed' + {kTDStatusNotFound, 404, "not_found"}, // for compatibility with CouchDB + {kTDStatusDuplicate, 412, "Already exists"}, // really 'Precondition Failed' - {kTDStatusBadEncoding, 400, @"Bad data encoding"}, - {kTDStatusBadAttachment, 400, @"Invalid attachment"}, - {kTDStatusAttachmentNotFound, 404, @"Attachment not found"}, - {kTDStatusBadJSON, 400, @"Invalid JSON"}, - {kTDStatusBadID, 400, @"Invalid database/document/revision ID"}, - {kTDStatusBadParam, 400, @"Invalid parameter in JSON body"}, - {kTDStatusDeleted, 404, @"deleted"}, + {kTDStatusBadEncoding, 400, "Bad data encoding"}, + {kTDStatusBadAttachment, 400, "Invalid attachment"}, + {kTDStatusAttachmentNotFound, 404, "Attachment not found"}, + {kTDStatusBadJSON, 400, "Invalid JSON"}, + {kTDStatusBadID, 400, "Invalid database/document/revision ID"}, + {kTDStatusBadParam, 400, "Invalid parameter in JSON body"}, + {kTDStatusDeleted, 404, "deleted"}, - {kTDStatusUpstreamError, 502, @"Invalid response from remote replication server"}, - {kTDStatusDBError, 500, @"Database error!"}, - {kTDStatusCorruptError, 500, @"Invalid data in database"}, - {kTDStatusAttachmentError, 500, @"Attachment store error"}, - {kTDStatusCallbackError, 500, @"Application callback block failed"}, - {kTDStatusException, 500, @"Internal error"}, + {kTDStatusUpstreamError, 502, "Invalid response from remote replication server"}, + {kTDStatusDBError, 500, "Database error!"}, + {kTDStatusCorruptError, 500, "Invalid data in database"}, + {kTDStatusAttachmentError, 500, "Attachment store error"}, + {kTDStatusCallbackError, 500, "Application callback block failed"}, + {kTDStatusException, 500, "Internal error"}, }; @@ -50,7 +50,7 @@ int TDStatusToHTTPStatus( TDStatus status, NSString** outMessage ) { for (unsigned i=0; i < sizeof(kStatusMap)/sizeof(kStatusMap[0]); ++i) { if (kStatusMap[i].status == status) { if (outMessage) - *outMessage = kStatusMap[i].message; + *outMessage = [NSString stringWithUTF8String: kStatusMap[i].message]; return kStatusMap[i].httpStatus; } } diff --git a/Source/TDURLProtocol.m b/Source/TDURLProtocol.m index d149e7b..1763ef7 100644 --- a/Source/TDURLProtocol.m +++ b/Source/TDURLProtocol.m @@ -59,7 +59,6 @@ + (TDServer*) server { + (void) forgetServers { @synchronized(self) { - [sHostMap release]; sHostMap = nil; } } @@ -154,8 +153,6 @@ + (NSURLRequest*) canonicalRequestForRequest: (NSURLRequest*)request { - (void) dealloc { [_router stop]; - [_router release]; - [super dealloc]; } @@ -174,23 +171,29 @@ - (void) startLoading { NSThread* loaderThread = [NSThread currentThread]; _router = [[TDRouter alloc] initWithServer: server request: self.request isLocal: YES]; + + __weak id weakSelf = self; + _router.onResponseReady = ^(TDResponse* routerResponse) { - [self performSelector: @selector(onResponseReady:) - onThread: loaderThread - withObject: routerResponse - waitUntilDone: NO]; + id strongSelf = weakSelf; + [strongSelf performSelector: @selector(onResponseReady:) + onThread: loaderThread + withObject: routerResponse + waitUntilDone: NO]; }; _router.onDataAvailable = ^(NSData* data, BOOL finished) { - [self performSelector: @selector(onDataAvailable:) - onThread: loaderThread - withObject: data - waitUntilDone: NO]; + id strongSelf = weakSelf; + [strongSelf performSelector: @selector(onDataAvailable:) + onThread: loaderThread + withObject: data + waitUntilDone: NO]; }; _router.onFinished = ^{ - [self performSelector: @selector(onFinished) - onThread: loaderThread - withObject: nil - waitUntilDone: NO]; + id strongSelf = weakSelf; + [strongSelf performSelector: @selector(onFinished) + onThread: loaderThread + withObject: nil + waitUntilDone: NO]; }; [_router start]; } @@ -207,7 +210,6 @@ - (void) onResponseReady: (TDResponse*)routerResponse { headerFields: routerResponse.headers]; [self.client URLProtocol: self didReceiveResponse: response cacheStoragePolicy: NSURLCacheStorageNotAllowed]; - [response release]; } @@ -288,7 +290,7 @@ - (void)stopLoading { NSData* body = [NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error]; - NSString* bodyStr = [[[NSString alloc] initWithData: body encoding: NSUTF8StringEncoding] autorelease]; + NSString* bodyStr = [[NSString alloc] initWithData: body encoding: NSUTF8StringEncoding]; Log(@"Response = %@", response); Log(@"MIME Type = %@", response.MIMEType); Log(@"Body = %@", bodyStr); diff --git a/Source/TDView.h b/Source/TDView.h index 105a137..1e975a7 100644 --- a/Source/TDView.h +++ b/Source/TDView.h @@ -64,7 +64,7 @@ typedef enum { @interface TDView : NSObject { @private - TDDatabase* _db; + TDDatabase* __weak _db; NSString* _name; int _viewID; TDMapBlock _mapBlock; diff --git a/Source/TDView.m b/Source/TDView.m index 7bb0d91..e4bd0aa 100644 --- a/Source/TDView.m +++ b/Source/TDView.m @@ -51,12 +51,6 @@ - (id) initWithDatabase: (TDDatabase*)db name: (NSString*)name { } -- (void)dealloc { - [_name release]; - [_mapBlock release]; - [_reduceBlock release]; - [super dealloc]; -} @synthesize database=_db, name=_name, mapBlock=_mapBlock, reduceBlock=_reduceBlock, @@ -81,10 +75,8 @@ - (BOOL) setMapBlock: (TDMapBlock)mapBlock { Assert(mapBlock); Assert(version); - [_mapBlock autorelease]; - _mapBlock = [mapBlock copy]; - [_reduceBlock autorelease]; - _reduceBlock = [reduceBlock copy]; + _mapBlock = mapBlock; // copied implicitly in ARC + _reduceBlock = reduceBlock; // copied implicitly in ARC if (![_db open]) return NO; @@ -303,7 +295,7 @@ - (TDStatus) updateIndex { if (conflicts) { // Add a "_conflicts" property if there were conflicting revisions: - NSMutableDictionary* mutableProps = [[properties mutableCopy] autorelease]; + NSMutableDictionary* mutableProps = [properties mutableCopy]; mutableProps[@"_conflicts"] = conflicts; properties = mutableProps; } @@ -514,8 +506,6 @@ - (id) reduceKeys: (NSMutableArray*)keys values: (NSMutableArray*)values { TDLazyArrayOfJSON* lazyKeys = [[TDLazyArrayOfJSON alloc] initWithArray: keys]; TDLazyArrayOfJSON* lazyVals = [[TDLazyArrayOfJSON alloc] initWithArray: values]; id result = _reduceBlock(lazyKeys, lazyVals, NO); - [lazyKeys release]; - [lazyVals release]; return result ?: $null; } @@ -543,7 +533,6 @@ - (NSMutableArray*) reducedQuery: (FMResultSet*)r group: (BOOL)group groupLevel: {@"value", reduced})]; [keysToReduce removeAllObjects]; [valuesToReduce removeAllObjects]; - [lastKeyData release]; } lastKeyData = [keyData copy]; } @@ -562,9 +551,6 @@ - (NSMutableArray*) reducedQuery: (FMResultSet*)r group: (BOOL)group groupLevel: _name, toJSONString(key), toJSONString(reduced)); [rows addObject: $dict({@"key", key}, {@"value", reduced})]; } - [keysToReduce release]; - [valuesToReduce release]; - [lastKeyData release]; return rows; } @@ -601,8 +587,7 @@ + (NSNumber*) totalValues: (NSArray*)values { + (void) setCompiler: (id)compiler { - [sCompiler autorelease]; - sCompiler = [compiler retain]; + sCompiler = compiler; } + (id) compiler { diff --git a/Source/TDView_Tests.m b/Source/TDView_Tests.m index 17a88ea..995df43 100644 --- a/Source/TDView_Tests.m +++ b/Source/TDView_Tests.m @@ -35,7 +35,7 @@ CAssert(view); CAssertEq(view.database, db); CAssertEqual(view.name, @"aview"); - CAssertNull(view.mapBlock); + CAssert(view.mapBlock == nil, nil); CAssertEq([db existingViewNamed: @"aview"], view); @@ -58,7 +58,7 @@ static TDRevision* putDoc(TDDatabase* db, NSDictionary* props) { - TDRevision* rev = [[[TDRevision alloc] initWithProperties: props] autorelease]; + TDRevision* rev = [[TDRevision alloc] initWithProperties: props]; TDStatus status; TDRevision* result = [db putRevision: rev prevRevisionID: nil allowConflict: NO status: &status]; CAssert(status < 300); @@ -114,7 +114,7 @@ CAssertEq([view updateIndex], kTDStatusNotModified); // Now add a doc and update a doc: - TDRevision* threeUpdated = [[[TDRevision alloc] initWithDocID: rev3.docID revID: nil deleted:NO] autorelease]; + TDRevision* threeUpdated = [[TDRevision alloc] initWithDocID: rev3.docID revID: nil deleted:NO]; threeUpdated.properties = $dict({@"key", @"3hree"}); TDStatus status; rev3 = [db putRevision: threeUpdated prevRevisionID: rev3.revID allowConflict: NO status: &status]; @@ -122,7 +122,7 @@ TDRevision* rev4 = putDoc(db, $dict({@"key", @"four"})); - TDRevision* twoDeleted = [[[TDRevision alloc] initWithDocID: rev2.docID revID: nil deleted:YES] autorelease]; + TDRevision* twoDeleted = [[TDRevision alloc] initWithDocID: rev2.docID revID: nil deleted:YES]; [db putRevision: twoDeleted prevRevisionID: rev2.revID allowConflict: NO status: &status]; CAssert(status < 300); @@ -159,7 +159,7 @@ NSDictionary* props = $dict({@"_id", @"44444"}, {@"_rev", @"1-~~~~~"}, // higher revID, will win conflict {@"key", @"40ur"}); - TDRevision* leaf2 = [[[TDRevision alloc] initWithProperties: props] autorelease]; + TDRevision* leaf2 = [[TDRevision alloc] initWithProperties: props]; TDStatus status = [db forceInsert: leaf2 revisionHistory: @[] source: nil]; CAssert(status < 300); CAssertEqual(leaf1.docID, leaf2.docID); @@ -205,7 +205,7 @@ NSDictionary* props = $dict({@"_id", @"44444"}, {@"_rev", @"1-~~~~~"}, // higher revID, will win conflict {@"key", @"40ur"}); - TDRevision* leaf2 = [[[TDRevision alloc] initWithProperties: props] autorelease]; + TDRevision* leaf2 = [[TDRevision alloc] initWithProperties: props]; TDStatus status = [db forceInsert: leaf2 revisionHistory: @[] source: nil]; CAssert(status < 300); CAssertEqual(leaf1.docID, leaf2.docID); @@ -245,7 +245,7 @@ NSDictionary* props = $dict({@"_id", @"44444"}, {@"_rev", @"1-...."}, // lower revID, will lose conflict {@"key", @"40ur"}); - TDRevision* leaf2 = [[[TDRevision alloc] initWithProperties: props] autorelease]; + TDRevision* leaf2 = [[TDRevision alloc] initWithProperties: props]; TDStatus status = [db forceInsert: leaf2 revisionHistory: @[] source: nil]; CAssert(status < 300); CAssertEqual(leaf1.docID, leaf2.docID); @@ -316,7 +316,8 @@ // Specific keys: options = kDefaultTDQueryOptions; - options.keys = @[@"two", @"four"]; + NSArray* keys = @[@"two", @"four"]; + options.keys = keys; rows = [view queryWithOptions: &options status: &status]; expectedRows = $array($dict({@"id", @"44444"}, {@"key", @"four"}), $dict({@"id", @"22222"}, {@"key", @"two"})); @@ -384,7 +385,7 @@ // Delete a document: TDRevision* del = docs[0]; - del = [[[TDRevision alloc] initWithDocID: del.docID revID: del.revID deleted: YES] autorelease]; + del = [[TDRevision alloc] initWithDocID: del.docID revID: del.revID deleted: YES]; TDStatus status; del = [db putRevision: del prevRevisionID: del.revID allowConflict: NO status: &status]; CAssertEq(status, kTDStatusOK); diff --git a/TouchDB.xcodeproj/project.pbxproj b/TouchDB.xcodeproj/project.pbxproj index a921571..19238d4 100644 --- a/TouchDB.xcodeproj/project.pbxproj +++ b/TouchDB.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2700BC5114B3864B00B5B297 /* HTTPFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156914ACEFC90065964D /* HTTPFileResponse.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; + 2700BC5114B3864B00B5B297 /* HTTPFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156914ACEFC90065964D /* HTTPFileResponse.m */; }; 2700BC5E14B64AA600B5B297 /* TDRouter+Handlers.m in Sources */ = {isa = PBXBuildFile; fileRef = 2700BC5B14B64AA600B5B297 /* TDRouter+Handlers.m */; }; 2700BC5F14B64AA600B5B297 /* TDRouter+Handlers.m in Sources */ = {isa = PBXBuildFile; fileRef = 2700BC5B14B64AA600B5B297 /* TDRouter+Handlers.m */; }; 270B3DFD1489359000E0A926 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 270B3DFC1489359000E0A926 /* SenTestingKit.framework */; }; @@ -36,7 +36,7 @@ 270B3E3A14898DF200E0A926 /* TDRevision.m in Sources */ = {isa = PBXBuildFile; fileRef = 270B3E3814898DF200E0A926 /* TDRevision.m */; }; 270B3E3E148D7F0000E0A926 /* TDPusher.h in Headers */ = {isa = PBXBuildFile; fileRef = 270B3E3C148D7F0000E0A926 /* TDPusher.h */; settings = {ATTRIBUTES = (Public, ); }; }; 270B3E3F148D7F0000E0A926 /* TDPusher.m in Sources */ = {isa = PBXBuildFile; fileRef = 270B3E3D148D7F0000E0A926 /* TDPusher.m */; }; - 270F5702156AD215000FEB8F /* OARequestParameter.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12862156ABE24008465C2 /* OARequestParameter.m */; }; + 270F5702156AD215000FEB8F /* OARequestParameter.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12862156ABE24008465C2 /* OARequestParameter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 270F5705156AE0BF000FEB8F /* TDAuthorizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 270F5703156AE0BF000FEB8F /* TDAuthorizer.h */; }; 270F5706156AE0BF000FEB8F /* TDAuthorizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 270F5704156AE0BF000FEB8F /* TDAuthorizer.m */; }; 270F5707156AE0BF000FEB8F /* TDAuthorizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 270F5704156AE0BF000FEB8F /* TDAuthorizer.m */; }; @@ -91,36 +91,36 @@ 275315E414ACF1130065964D /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155214ACEFC90065964D /* DDData.m */; }; 275315E514ACF1130065964D /* DDNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155414ACEFC90065964D /* DDNumber.m */; }; 275315E614ACF1130065964D /* DDRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155614ACEFC90065964D /* DDRange.m */; }; - 275315E714ACF1130065964D /* HTTPAuthenticationRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155814ACEFC90065964D /* HTTPAuthenticationRequest.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 275315E814ACF1130065964D /* HTTPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155A14ACEFC90065964D /* HTTPConnection.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 275315E914ACF1130065964D /* HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155D14ACEFC90065964D /* HTTPMessage.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 275315EA14ACF1130065964D /* HTTPServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156014ACEFC90065964D /* HTTPServer.m */; settings = {COMPILER_FLAGS = "-fobjc-arc -Wno-undeclared-selector"; }; }; - 275315EC14ACF1130065964D /* HTTPDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156514ACEFC90065964D /* HTTPDataResponse.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 275315F014ACF1130065964D /* WebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156D14ACEFC90065964D /* WebSocket.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 275315F114ACF1130065964D /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315A914ACF00B0065964D /* GCDAsyncSocket.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 275315F214ACF1130065964D /* DDLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315B814ACF0330065964D /* DDLog.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; + 275315E714ACF1130065964D /* HTTPAuthenticationRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155814ACEFC90065964D /* HTTPAuthenticationRequest.m */; }; + 275315E814ACF1130065964D /* HTTPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155A14ACEFC90065964D /* HTTPConnection.m */; }; + 275315E914ACF1130065964D /* HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155D14ACEFC90065964D /* HTTPMessage.m */; }; + 275315EA14ACF1130065964D /* HTTPServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156014ACEFC90065964D /* HTTPServer.m */; settings = {COMPILER_FLAGS = "-Wno-undeclared-selector"; }; }; + 275315EC14ACF1130065964D /* HTTPDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156514ACEFC90065964D /* HTTPDataResponse.m */; }; + 275315F014ACF1130065964D /* WebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156D14ACEFC90065964D /* WebSocket.m */; }; + 275315F114ACF1130065964D /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315A914ACF00B0065964D /* GCDAsyncSocket.m */; }; + 275315F214ACF1130065964D /* DDLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315B814ACF0330065964D /* DDLog.m */; }; 275315F314ACF1C20065964D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27C7069C148864BA00F0F099 /* Foundation.framework */; }; 275315F514ACF1CC0065964D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 275315F414ACF1CC0065964D /* Security.framework */; }; 275315F814ACF2500065964D /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 275315F714ACF2500065964D /* CoreServices.framework */; }; 275315F914ACF2D70065964D /* TDListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 275315DE14ACF0A20065964D /* TDListener.h */; settings = {ATTRIBUTES = (Public, ); }; }; 275315FC14ACF83C0065964D /* TouchDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 270B3DEA1489359000E0A926 /* TouchDB.framework */; }; - 275315FF14ACF9330065964D /* ExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751711CDC80A00E9A2AB /* ExceptionUtils.m */; }; - 2753160014ACF9330065964D /* Logging.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751211CDC7F900E9A2AB /* Logging.m */; }; - 2753160114ACF9330065964D /* CollectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749C11CD5B4F00E9A2AB /* CollectionUtils.m */; }; - 2753160214ACF9330065964D /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749E11CD5B4F00E9A2AB /* Test.m */; }; + 275315FF14ACF9330065964D /* ExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751711CDC80A00E9A2AB /* ExceptionUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2753160014ACF9330065964D /* Logging.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751211CDC7F900E9A2AB /* Logging.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2753160114ACF9330065964D /* CollectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749C11CD5B4F00E9A2AB /* CollectionUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2753160214ACF9330065964D /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749E11CD5B4F00E9A2AB /* Test.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 2753160C14ACFC2A0065964D /* TDHTTPConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 2753160A14ACFC2A0065964D /* TDHTTPConnection.h */; }; 2753160D14ACFC2A0065964D /* TDHTTPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753160B14ACFC2A0065964D /* TDHTTPConnection.m */; }; 275F535015C04F7B00BAF578 /* MYStreamUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 275F534E15C04F7B00BAF578 /* MYStreamUtils.h */; }; - 275F535115C04F7B00BAF578 /* MYStreamUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 275F534F15C04F7B00BAF578 /* MYStreamUtils.m */; }; - 275F535215C04F7B00BAF578 /* MYStreamUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 275F534F15C04F7B00BAF578 /* MYStreamUtils.m */; }; + 275F535115C04F7B00BAF578 /* MYStreamUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 275F534F15C04F7B00BAF578 /* MYStreamUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 275F535215C04F7B00BAF578 /* MYStreamUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 275F534F15C04F7B00BAF578 /* MYStreamUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 2766EFF814DB7F9F009ECCA8 /* TDMultipartWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2766EFF614DB7F9F009ECCA8 /* TDMultipartWriter.h */; }; 2766EFF914DB7F9F009ECCA8 /* TDMultipartWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2766EFF714DB7F9F009ECCA8 /* TDMultipartWriter.m */; }; 2766EFFA14DB7F9F009ECCA8 /* TDMultipartWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2766EFF714DB7F9F009ECCA8 /* TDMultipartWriter.m */; }; 2766EFFD14DC7B37009ECCA8 /* TDMultiStreamWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2766EFFB14DC7B37009ECCA8 /* TDMultiStreamWriter.h */; }; 2766EFFE14DC7B37009ECCA8 /* TDMultiStreamWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2766EFFC14DC7B37009ECCA8 /* TDMultiStreamWriter.m */; }; 2766EFFF14DC7B37009ECCA8 /* TDMultiStreamWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2766EFFC14DC7B37009ECCA8 /* TDMultiStreamWriter.m */; }; - 2767D7DF14C8D3E500ED0F26 /* Logging.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751211CDC7F900E9A2AB /* Logging.m */; }; - 2767D7E014C8D3EA00ED0F26 /* CollectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749C11CD5B4F00E9A2AB /* CollectionUtils.m */; }; + 2767D7DF14C8D3E500ED0F26 /* Logging.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751211CDC7F900E9A2AB /* Logging.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2767D7E014C8D3EA00ED0F26 /* CollectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749C11CD5B4F00E9A2AB /* CollectionUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 27731EFF1493FA3100815D67 /* TDBlobStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 27731EFD1493FA3100815D67 /* TDBlobStore.h */; }; 27731F001493FA3100815D67 /* TDBlobStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 27731EFE1493FA3100815D67 /* TDBlobStore.m */; }; 27731F061495335B00815D67 /* TDBlobStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 27731EFE1493FA3100815D67 /* TDBlobStore.m */; }; @@ -146,8 +146,8 @@ 2773ADC814BD1EB80027A292 /* TDDatabase+LocalDocs.m in Sources */ = {isa = PBXBuildFile; fileRef = 2773ADC614BD1EB80027A292 /* TDDatabase+LocalDocs.m */; }; 2773ADC914BD1EB80027A292 /* TDDatabase+LocalDocs.m in Sources */ = {isa = PBXBuildFile; fileRef = 2773ADC614BD1EB80027A292 /* TDDatabase+LocalDocs.m */; }; 2781E3C915C31FDA00E970DC /* MYRegexUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 2781E3C715C31FDA00E970DC /* MYRegexUtils.h */; }; - 2781E3CA15C31FDA00E970DC /* MYRegexUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 2781E3C815C31FDA00E970DC /* MYRegexUtils.m */; }; - 2781E3CB15C31FDA00E970DC /* MYRegexUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 2781E3C815C31FDA00E970DC /* MYRegexUtils.m */; }; + 2781E3CA15C31FDA00E970DC /* MYRegexUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 2781E3C815C31FDA00E970DC /* MYRegexUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2781E3CB15C31FDA00E970DC /* MYRegexUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 2781E3C815C31FDA00E970DC /* MYRegexUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 27821BB7148E7D6F0099B373 /* TDReplicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 27821BB5148E7D6F0099B373 /* TDReplicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27821BB8148E7D6F0099B373 /* TDReplicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 27821BB6148E7D6F0099B373 /* TDReplicator.m */; }; 27821BBA148FF56D0099B373 /* TDDatabase_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 27821BB9148FF56C0099B373 /* TDDatabase_Tests.m */; }; @@ -157,8 +157,8 @@ 278B0CA1152A8B1900577747 /* TDCanonicalJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 278B0C9F152A8B1900577747 /* TDCanonicalJSON.m */; }; 278B0CA2152A8B1900577747 /* TDCanonicalJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 278B0C9F152A8B1900577747 /* TDCanonicalJSON.m */; }; 278E4DD81562B40B00DDCEF9 /* MYURLUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 278E4DD61562B40B00DDCEF9 /* MYURLUtils.h */; }; - 278E4DD91562B40B00DDCEF9 /* MYURLUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 278E4DD71562B40B00DDCEF9 /* MYURLUtils.m */; }; - 278E4DDA1562B40B00DDCEF9 /* MYURLUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 278E4DD71562B40B00DDCEF9 /* MYURLUtils.m */; }; + 278E4DD91562B40B00DDCEF9 /* MYURLUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 278E4DD71562B40B00DDCEF9 /* MYURLUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 278E4DDA1562B40B00DDCEF9 /* MYURLUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 278E4DD71562B40B00DDCEF9 /* MYURLUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 279906E3149A65B8003D4338 /* TDRemoteRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 279906E1149A65B7003D4338 /* TDRemoteRequest.h */; }; 279906E5149A65B8003D4338 /* TDRemoteRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 279906E2149A65B8003D4338 /* TDRemoteRequest.m */; }; 279906E6149A65B8003D4338 /* TDRemoteRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 279906E2149A65B8003D4338 /* TDRemoteRequest.m */; }; @@ -170,11 +170,11 @@ 279C7E2E14F424090004A1E8 /* TDSequenceMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 279C7E2C14F424090004A1E8 /* TDSequenceMap.h */; }; 279C7E2F14F424090004A1E8 /* TDSequenceMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 279C7E2D14F424090004A1E8 /* TDSequenceMap.m */; }; 279C7E3014F424090004A1E8 /* TDSequenceMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 279C7E2D14F424090004A1E8 /* TDSequenceMap.m */; }; - 279CE39014D1EDA0009F3FA6 /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749E11CD5B4F00E9A2AB /* Test.m */; }; + 279CE39014D1EDA0009F3FA6 /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749E11CD5B4F00E9A2AB /* Test.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 279CE3B814D4A885009F3FA6 /* MYBlockUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 279CE3B614D4A885009F3FA6 /* MYBlockUtils.h */; }; - 279CE3B914D4A885009F3FA6 /* MYBlockUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3B714D4A885009F3FA6 /* MYBlockUtils.m */; }; - 279CE3BA14D4A886009F3FA6 /* MYBlockUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3B714D4A885009F3FA6 /* MYBlockUtils.m */; }; - 279CE3BB14D4C775009F3FA6 /* MYBlockUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3B714D4A885009F3FA6 /* MYBlockUtils.m */; }; + 279CE3B914D4A885009F3FA6 /* MYBlockUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3B714D4A885009F3FA6 /* MYBlockUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 279CE3BA14D4A886009F3FA6 /* MYBlockUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3B714D4A885009F3FA6 /* MYBlockUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 279CE3BB14D4C775009F3FA6 /* MYBlockUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3B714D4A885009F3FA6 /* MYBlockUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 279CE40014D749A7009F3FA6 /* TDMultipartReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 279CE3FE14D749A7009F3FA6 /* TDMultipartReader.h */; }; 279CE40114D749A7009F3FA6 /* TDMultipartReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3FF14D749A7009F3FA6 /* TDMultipartReader.m */; }; 279CE40214D749A7009F3FA6 /* TDMultipartReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 279CE3FF14D749A7009F3FA6 /* TDMultipartReader.m */; }; @@ -196,7 +196,7 @@ 27A720A2152B959100C0A0E8 /* TDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A7209F152B959100C0A0E8 /* TDAttachment.m */; }; 27A82E3614A1145000C0B850 /* FMDatabaseAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 27A82E3414A1145000C0B850 /* FMDatabaseAdditions.h */; }; 27A82E3814A1145000C0B850 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A82E3514A1145000C0B850 /* FMDatabaseAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 27A82E3914A1145000C0B850 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A82E3514A1145000C0B850 /* FMDatabaseAdditions.m */; }; + 27A82E3914A1145000C0B850 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A82E3514A1145000C0B850 /* FMDatabaseAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 27AA409D14AA86AE00E2A5FF /* TDDatabase+Insertion.m in Sources */ = {isa = PBXBuildFile; fileRef = 27AA409A14AA86AD00E2A5FF /* TDDatabase+Insertion.m */; }; 27AA409E14AA86AE00E2A5FF /* TDDatabase+Insertion.m in Sources */ = {isa = PBXBuildFile; fileRef = 27AA409A14AA86AD00E2A5FF /* TDDatabase+Insertion.m */; }; 27AA40A314AA8A6600E2A5FF /* TDDatabase+Replication.m in Sources */ = {isa = PBXBuildFile; fileRef = 27AA40A014AA8A6600E2A5FF /* TDDatabase+Replication.m */; }; @@ -227,12 +227,12 @@ 27B0B7D71492B8A200A817AD /* TDPusher.m in Sources */ = {isa = PBXBuildFile; fileRef = 270B3E3D148D7F0000E0A926 /* TDPusher.m */; }; 27B0B7D81492B8A200A817AD /* TDChangeTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 27B0B791149290AB00A817AD /* TDChangeTracker.m */; }; 27B0B7DB1492B8A200A817AD /* TDBase64.m in Sources */ = {isa = PBXBuildFile; fileRef = 27B0B79D1492932700A817AD /* TDBase64.m */; }; - 27B0B7DC1492B8B200A817AD /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0747011CD51A200E9A2AB /* FMDatabase.m */; }; - 27B0B7DD1492B8B200A817AD /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0747211CD51A200E9A2AB /* FMResultSet.m */; }; - 27B0B7DE1492B8C100A817AD /* ExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751711CDC80A00E9A2AB /* ExceptionUtils.m */; }; - 27B0B7DF1492B8C100A817AD /* Logging.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751211CDC7F900E9A2AB /* Logging.m */; }; - 27B0B7E01492B8C100A817AD /* CollectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749C11CD5B4F00E9A2AB /* CollectionUtils.m */; }; - 27B0B7E11492B8C100A817AD /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749E11CD5B4F00E9A2AB /* Test.m */; }; + 27B0B7DC1492B8B200A817AD /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0747011CD51A200E9A2AB /* FMDatabase.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27B0B7DD1492B8B200A817AD /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0747211CD51A200E9A2AB /* FMResultSet.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27B0B7DE1492B8C100A817AD /* ExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751711CDC80A00E9A2AB /* ExceptionUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27B0B7DF1492B8C100A817AD /* Logging.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751211CDC7F900E9A2AB /* Logging.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27B0B7E01492B8C100A817AD /* CollectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749C11CD5B4F00E9A2AB /* CollectionUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27B0B7E11492B8C100A817AD /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0749E11CD5B4F00E9A2AB /* Test.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 27B0B7F71492BC7A00A817AD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27B0B7F61492BC7A00A817AD /* Foundation.framework */; }; 27B0B7F91492BC8100A817AD /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 27B0B7F81492BC8000A817AD /* libsqlite3.dylib */; }; 27B0B7FB1492BDE800A817AD /* TDDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F0744611CD4B6D00E9A2AB /* TDDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -277,12 +277,12 @@ 27CF5D2D152F514A0015D7A9 /* TDStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 27CF5D2C152F514A0015D7A9 /* TDStatus.m */; }; 27CF5D2E152F514A0015D7A9 /* TDStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 27CF5D2C152F514A0015D7A9 /* TDStatus.m */; }; 27D895CB14E4EF9E00AC701E /* Entitlements.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2714CF511496AE5B00E03341 /* Entitlements.plist */; }; - 27D90B1815601C340000735E /* MYErrorUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27D90B1715601C2F0000735E /* MYErrorUtils.m */; }; - 27D90B1915601C350000735E /* MYErrorUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27D90B1715601C2F0000735E /* MYErrorUtils.m */; }; + 27D90B1815601C340000735E /* MYErrorUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27D90B1715601C2F0000735E /* MYErrorUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27D90B1915601C350000735E /* MYErrorUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27D90B1715601C2F0000735E /* MYErrorUtils.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 27D90B1A15601F8C0000735E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27E7FB02155DBDA20025F93A /* Security.framework */; }; 27DB90D714DB249700FC7118 /* GTMNSData+zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = 27DB90D514DB249700FC7118 /* GTMNSData+zlib.h */; }; - 27DB90D814DB249700FC7118 /* GTMNSData+zlib.m in Sources */ = {isa = PBXBuildFile; fileRef = 27DB90D614DB249700FC7118 /* GTMNSData+zlib.m */; }; - 27DB90D914DB249700FC7118 /* GTMNSData+zlib.m in Sources */ = {isa = PBXBuildFile; fileRef = 27DB90D614DB249700FC7118 /* GTMNSData+zlib.m */; }; + 27DB90D814DB249700FC7118 /* GTMNSData+zlib.m in Sources */ = {isa = PBXBuildFile; fileRef = 27DB90D614DB249700FC7118 /* GTMNSData+zlib.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27DB90D914DB249700FC7118 /* GTMNSData+zlib.m in Sources */ = {isa = PBXBuildFile; fileRef = 27DB90D614DB249700FC7118 /* GTMNSData+zlib.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 27DB90DB14DB24E800FC7118 /* GTMDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 27DB90DA14DB24E800FC7118 /* GTMDefines.h */; }; 27DB90DD14DB250500FC7118 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 27DB90DC14DB250500FC7118 /* libz.dylib */; }; 27DB90DF14DB4B0100FC7118 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 27DB90DE14DB4B0100FC7118 /* libz.dylib */; }; @@ -316,34 +316,34 @@ 27F0751811CDC80A00E9A2AB /* ExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F0751711CDC80A00E9A2AB /* ExceptionUtils.m */; }; 27F08C8A15A7A30D003C3E2B /* TDDatabaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2751D4E2151BAE7000F7FD57 /* TDDatabaseManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27F08C8B15A7A31B003C3E2B /* TDAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 27A7209E152B959100C0A0E8 /* TDAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 27F12887156ABE24008465C2 /* OAConsumer.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12856156ABE24008465C2 /* OAConsumer.m */; }; - 27F12890156ABE24008465C2 /* OAMutableURLRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285C156ABE24008465C2 /* OAMutableURLRequest.m */; }; - 27F12893156ABE24008465C2 /* OAPlaintextSignatureProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285E156ABE24008465C2 /* OAPlaintextSignatureProvider.m */; }; - 27F12899156ABE24008465C2 /* OARequestParameter.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12862156ABE24008465C2 /* OARequestParameter.m */; }; - 27F128A1156ABE24008465C2 /* OAToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12868156ABE24008465C2 /* OAToken.m */; }; - 27F128A8156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F128A7156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m */; }; - 27F128A9156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F128A7156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m */; }; + 27F12887156ABE24008465C2 /* OAConsumer.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12856156ABE24008465C2 /* OAConsumer.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F12890156ABE24008465C2 /* OAMutableURLRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285C156ABE24008465C2 /* OAMutableURLRequest.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F12893156ABE24008465C2 /* OAPlaintextSignatureProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285E156ABE24008465C2 /* OAPlaintextSignatureProvider.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F12899156ABE24008465C2 /* OARequestParameter.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12862156ABE24008465C2 /* OARequestParameter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F128A1156ABE24008465C2 /* OAToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12868156ABE24008465C2 /* OAToken.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F128A8156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F128A7156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F128A9156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F128A7156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 27F128AB156AC004008465C2 /* NSMutableURLRequest+Parameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F128AA156AC004008465C2 /* NSMutableURLRequest+Parameters.h */; }; 27F128B1156AC1CA008465C2 /* TDOAuth1Authorizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F128AF156AC1C8008465C2 /* TDOAuth1Authorizer.h */; }; 27F128B2156AC1CA008465C2 /* TDOAuth1Authorizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F128B0156AC1C9008465C2 /* TDOAuth1Authorizer.m */; }; 27F128B3156AC1CA008465C2 /* TDOAuth1Authorizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F128B0156AC1C9008465C2 /* TDOAuth1Authorizer.m */; }; - 27F128B5156AC8B7008465C2 /* OAToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12868156ABE24008465C2 /* OAToken.m */; }; - 27F128B7156AC8C5008465C2 /* OAPlaintextSignatureProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285E156ABE24008465C2 /* OAPlaintextSignatureProvider.m */; }; - 27F128B8156AC8EC008465C2 /* OAConsumer.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12856156ABE24008465C2 /* OAConsumer.m */; }; - 27F128B9156AC8F0008465C2 /* OAMutableURLRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285C156ABE24008465C2 /* OAMutableURLRequest.m */; }; + 27F128B5156AC8B7008465C2 /* OAToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12868156ABE24008465C2 /* OAToken.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F128B7156AC8C5008465C2 /* OAPlaintextSignatureProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285E156ABE24008465C2 /* OAPlaintextSignatureProvider.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F128B8156AC8EC008465C2 /* OAConsumer.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F12856156ABE24008465C2 /* OAConsumer.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 27F128B9156AC8F0008465C2 /* OAMutableURLRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F1285C156ABE24008465C2 /* OAMutableURLRequest.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; DA023B4614BCA94C008184BB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27F0745C11CD50A600E9A2AB /* Foundation.framework */; }; - DA147C0C14BCA98A0052DA4D /* TDListener.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315DF14ACF0A20065964D /* TDListener.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - DA147C0D14BCA98A0052DA4D /* TDHTTPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753160B14ACFC2A0065964D /* TDHTTPConnection.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - DA147C0E14BCA98A0052DA4D /* TDHTTPResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 27E11F0F14AD15940006B340 /* TDHTTPResponse.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + DA147C0C14BCA98A0052DA4D /* TDListener.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315DF14ACF0A20065964D /* TDListener.m */; }; + DA147C0D14BCA98A0052DA4D /* TDHTTPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753160B14ACFC2A0065964D /* TDHTTPConnection.m */; }; + DA147C0E14BCA98A0052DA4D /* TDHTTPResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 27E11F0F14AD15940006B340 /* TDHTTPResponse.m */; }; DA147C1314BCAA870052DA4D /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155214ACEFC90065964D /* DDData.m */; }; DA147C1414BCAA870052DA4D /* DDNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155414ACEFC90065964D /* DDNumber.m */; }; DA147C1514BCAA870052DA4D /* DDRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155614ACEFC90065964D /* DDRange.m */; }; DA147C1614BCAA8F0052DA4D /* DDLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315B814ACF0330065964D /* DDLog.m */; }; - DA147C1714BCAA9C0052DA4D /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315A914ACF00B0065964D /* GCDAsyncSocket.m */; settings = {COMPILER_FLAGS = "-fobjc-arc -Wno-undeclared-selector"; }; }; + DA147C1714BCAA9C0052DA4D /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 275315A914ACF00B0065964D /* GCDAsyncSocket.m */; settings = {COMPILER_FLAGS = "-Wno-undeclared-selector"; }; }; DA147C1814BCAAAD0052DA4D /* HTTPAuthenticationRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155814ACEFC90065964D /* HTTPAuthenticationRequest.m */; }; DA147C1914BCAAAD0052DA4D /* HTTPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155A14ACEFC90065964D /* HTTPConnection.m */; }; DA147C1A14BCAAAD0052DA4D /* HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753155D14ACEFC90065964D /* HTTPMessage.m */; }; - DA147C1B14BCAAAD0052DA4D /* HTTPServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156014ACEFC90065964D /* HTTPServer.m */; settings = {COMPILER_FLAGS = "-fobjc-arc -Wno-undeclared-selector"; }; }; + DA147C1B14BCAAAD0052DA4D /* HTTPServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156014ACEFC90065964D /* HTTPServer.m */; settings = {COMPILER_FLAGS = "-Wno-undeclared-selector"; }; }; DA147C1C14BCAABE0052DA4D /* HTTPDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156514ACEFC90065964D /* HTTPDataResponse.m */; }; DA147C1D14BCAABE0052DA4D /* HTTPFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156914ACEFC90065964D /* HTTPFileResponse.m */; }; DA147C1E14BCAABE0052DA4D /* WebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753156D14ACEFC90065964D /* WebSocket.m */; }; @@ -1916,9 +1916,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 270B3E161489382F00E0A926 /* FMDatabase.m in Sources */, - 27A82E3814A1145000C0B850 /* FMDatabaseAdditions.m in Sources */, - 270B3E181489382F00E0A926 /* FMResultSet.m in Sources */, 270B3E111489382F00E0A926 /* TDDatabase.m in Sources */, 270B3E121489382F00E0A926 /* TDBody.m in Sources */, 270B3E131489382F00E0A926 /* TDServer.m in Sources */, @@ -1935,6 +1932,7 @@ 279EB2DC1491C34300E74185 /* TDCollateJSON.m in Sources */, 27B0B7801491E76200A817AD /* TDView_Tests.m in Sources */, 27B0B797149290AB00A817AD /* TDChangeTracker.m in Sources */, + 27ED9AA3163B01E2000C844A /* TDSocketChangeTracker.m in Sources */, 27B0B79F1492932800A817AD /* TDBase64.m in Sources */, 27731F001493FA3100815D67 /* TDBlobStore.m in Sources */, 279906E5149A65B8003D4338 /* TDRemoteRequest.m in Sources */, @@ -1942,18 +1940,12 @@ 274C391E149FAE0000A5E89B /* TDDatabase+Attachments.m in Sources */, 27AA409D14AA86AE00E2A5FF /* TDDatabase+Insertion.m in Sources */, 27AA40A314AA8A6600E2A5FF /* TDDatabase+Replication.m in Sources */, - 275315FF14ACF9330065964D /* ExceptionUtils.m in Sources */, - 2753160014ACF9330065964D /* Logging.m in Sources */, - 2753160114ACF9330065964D /* CollectionUtils.m in Sources */, - 2753160214ACF9330065964D /* Test.m in Sources */, 2700BC5E14B64AA600B5B297 /* TDRouter+Handlers.m in Sources */, 2773ADC814BD1EB80027A292 /* TDDatabase+LocalDocs.m in Sources */, 27A073ED14C0BB6200F52FE7 /* TDMisc.m in Sources */, - 279CE3B914D4A885009F3FA6 /* MYBlockUtils.m in Sources */, 279CE40114D749A7009F3FA6 /* TDMultipartReader.m in Sources */, 279CE40614D88032009F3FA6 /* TDBlobStore_Tests.m in Sources */, 279CE40B14D8AA23009F3FA6 /* TDMultipartDownloader.m in Sources */, - 27DB90D814DB249700FC7118 /* GTMNSData+zlib.m in Sources */, 2766EFF914DB7F9F009ECCA8 /* TDMultipartWriter.m in Sources */, 2766EFFE14DC7B37009ECCA8 /* TDMultiStreamWriter.m in Sources */, 27C5305514DF3A050078F886 /* TDMultipartUploader.m in Sources */, @@ -1967,19 +1959,27 @@ 27A720A1152B959100C0A0E8 /* TDAttachment.m in Sources */, 27CF5D2D152F514A0015D7A9 /* TDStatus.m in Sources */, 27E7FAED155D78DA0025F93A /* TDChangeTracker_Tests.m in Sources */, + 270F5706156AE0BF000FEB8F /* TDAuthorizer.m in Sources */, + 27F128B2156AC1CA008465C2 /* TDOAuth1Authorizer.m in Sources */, + 270B3E161489382F00E0A926 /* FMDatabase.m in Sources */, + 27A82E3814A1145000C0B850 /* FMDatabaseAdditions.m in Sources */, + 270B3E181489382F00E0A926 /* FMResultSet.m in Sources */, + 275315FF14ACF9330065964D /* ExceptionUtils.m in Sources */, + 2753160014ACF9330065964D /* Logging.m in Sources */, + 2753160114ACF9330065964D /* CollectionUtils.m in Sources */, + 2753160214ACF9330065964D /* Test.m in Sources */, + 279CE3B914D4A885009F3FA6 /* MYBlockUtils.m in Sources */, 27D90B1815601C340000735E /* MYErrorUtils.m in Sources */, 278E4DD91562B40B00DDCEF9 /* MYURLUtils.m in Sources */, + 275F535115C04F7B00BAF578 /* MYStreamUtils.m in Sources */, + 2781E3CA15C31FDA00E970DC /* MYRegexUtils.m in Sources */, + 27DB90D814DB249700FC7118 /* GTMNSData+zlib.m in Sources */, 27F128A8156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m in Sources */, - 27F128B2156AC1CA008465C2 /* TDOAuth1Authorizer.m in Sources */, 27F128B5156AC8B7008465C2 /* OAToken.m in Sources */, 27F128B7156AC8C5008465C2 /* OAPlaintextSignatureProvider.m in Sources */, 27F128B8156AC8EC008465C2 /* OAConsumer.m in Sources */, 27F128B9156AC8F0008465C2 /* OAMutableURLRequest.m in Sources */, 270F5702156AD215000FEB8F /* OARequestParameter.m in Sources */, - 270F5706156AE0BF000FEB8F /* TDAuthorizer.m in Sources */, - 275F535115C04F7B00BAF578 /* MYStreamUtils.m in Sources */, - 2781E3CA15C31FDA00E970DC /* MYRegexUtils.m in Sources */, - 27ED9AA3163B01E2000C844A /* TDSocketChangeTracker.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2053,26 +2053,17 @@ 27B0B7D71492B8A200A817AD /* TDPusher.m in Sources */, 27B0B7D81492B8A200A817AD /* TDChangeTracker.m in Sources */, 27B0B7DB1492B8A200A817AD /* TDBase64.m in Sources */, - 27B0B7DC1492B8B200A817AD /* FMDatabase.m in Sources */, - 27B0B7DD1492B8B200A817AD /* FMResultSet.m in Sources */, - 27B0B7DE1492B8C100A817AD /* ExceptionUtils.m in Sources */, - 27B0B7DF1492B8C100A817AD /* Logging.m in Sources */, - 27B0B7E01492B8C100A817AD /* CollectionUtils.m in Sources */, - 27B0B7E11492B8C100A817AD /* Test.m in Sources */, 27731F061495335B00815D67 /* TDBlobStore.m in Sources */, 279906E6149A65B8003D4338 /* TDRemoteRequest.m in Sources */, 279906F1149ABFC2003D4338 /* TDBatcher.m in Sources */, 274C391F149FAE0000A5E89B /* TDDatabase+Attachments.m in Sources */, - 27A82E3914A1145000C0B850 /* FMDatabaseAdditions.m in Sources */, 27AA409E14AA86AE00E2A5FF /* TDDatabase+Insertion.m in Sources */, 27AA40A414AA8A6600E2A5FF /* TDDatabase+Replication.m in Sources */, 2700BC5F14B64AA600B5B297 /* TDRouter+Handlers.m in Sources */, 2773ADC914BD1EB80027A292 /* TDDatabase+LocalDocs.m in Sources */, 27A073EE14C0BB6200F52FE7 /* TDMisc.m in Sources */, - 279CE3BA14D4A886009F3FA6 /* MYBlockUtils.m in Sources */, 279CE40214D749A7009F3FA6 /* TDMultipartReader.m in Sources */, 279CE40C14D8AA23009F3FA6 /* TDMultipartDownloader.m in Sources */, - 27DB90D914DB249700FC7118 /* GTMNSData+zlib.m in Sources */, 2766EFFA14DB7F9F009ECCA8 /* TDMultipartWriter.m in Sources */, 2766EFFF14DC7B37009ECCA8 /* TDMultiStreamWriter.m in Sources */, 27C5305614DF3A050078F886 /* TDMultipartUploader.m in Sources */, @@ -2085,6 +2076,18 @@ 278B0CA2152A8B1900577747 /* TDCanonicalJSON.m in Sources */, 27A720A2152B959100C0A0E8 /* TDAttachment.m in Sources */, 27CF5D2E152F514A0015D7A9 /* TDStatus.m in Sources */, + 27F128B3156AC1CA008465C2 /* TDOAuth1Authorizer.m in Sources */, + 270F5707156AE0BF000FEB8F /* TDAuthorizer.m in Sources */, + 27ED9AA4163B01E2000C844A /* TDSocketChangeTracker.m in Sources */, + 27B0B7DC1492B8B200A817AD /* FMDatabase.m in Sources */, + 27B0B7DD1492B8B200A817AD /* FMResultSet.m in Sources */, + 27B0B7DE1492B8C100A817AD /* ExceptionUtils.m in Sources */, + 27B0B7DF1492B8C100A817AD /* Logging.m in Sources */, + 27B0B7E01492B8C100A817AD /* CollectionUtils.m in Sources */, + 27B0B7E11492B8C100A817AD /* Test.m in Sources */, + 27A82E3914A1145000C0B850 /* FMDatabaseAdditions.m in Sources */, + 279CE3BA14D4A886009F3FA6 /* MYBlockUtils.m in Sources */, + 27DB90D914DB249700FC7118 /* GTMNSData+zlib.m in Sources */, 27D90B1915601C350000735E /* MYErrorUtils.m in Sources */, 278E4DDA1562B40B00DDCEF9 /* MYURLUtils.m in Sources */, 27F12887156ABE24008465C2 /* OAConsumer.m in Sources */, @@ -2093,11 +2096,8 @@ 27F12899156ABE24008465C2 /* OARequestParameter.m in Sources */, 27F128A1156ABE24008465C2 /* OAToken.m in Sources */, 27F128A9156ABFE0008465C2 /* NSMutableURLRequest+Parameters.m in Sources */, - 27F128B3156AC1CA008465C2 /* TDOAuth1Authorizer.m in Sources */, - 270F5707156AE0BF000FEB8F /* TDAuthorizer.m in Sources */, 275F535215C04F7B00BAF578 /* MYStreamUtils.m in Sources */, 2781E3CB15C31FDA00E970DC /* MYRegexUtils.m in Sources */, - 27ED9AA4163B01E2000C844A /* TDSocketChangeTracker.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2308,6 +2308,7 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; + CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -2336,6 +2337,7 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; + CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -2361,6 +2363,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2384,6 +2387,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; DEPLOYMENT_POSTPROCESSING = YES; DYLIB_COMPATIBILITY_VERSION = 1; diff --git a/vendor/MYUtilities b/vendor/MYUtilities index 0cc46aa..32dedaa 160000 --- a/vendor/MYUtilities +++ b/vendor/MYUtilities @@ -1 +1 @@ -Subproject commit 0cc46aaf394dfe451d83d0ae3954643662210767 +Subproject commit 32dedaad7f2f231fbe8fc0dcde85ae58725e20b0