Added ARC support
diff --git a/CGDWebServer/GCDWebServer.m b/CGDWebServer/GCDWebServer.m
index db45a48..f63fe62 100644
--- a/CGDWebServer/GCDWebServer.m
+++ b/CGDWebServer/GCDWebServer.m
@@ -50,9 +50,9 @@
if (extension.length) {
mimeType = [_overrides objectForKey:extension];
if (mimeType == nil) {
- CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)extension, NULL);
+ CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (ARC_BRIDGE CFStringRef)extension, NULL);
if (uti) {
- mimeType = [(id)UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType) autorelease];
+ mimeType = ARC_BRIDGE_RELEASE(UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType));
CFRelease(uti);
}
}
@@ -61,8 +61,8 @@
}
NSString* GCDWebServerUnescapeURLString(NSString* string) {
- return [(id)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)string, CFSTR(""),
- kCFStringEncodingUTF8) autorelease];
+ return ARC_BRIDGE_RELEASE(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)string, CFSTR(""),
+ kCFStringEncodingUTF8));
}
NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form) {
@@ -90,7 +90,7 @@
}
[scanner setScanLocation:([scanner scanLocation] + 1)];
}
- [scanner release];
+ ARC_RELEASE(scanner);
return parameters;
}
@@ -105,17 +105,17 @@
- (id)initWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock {
if ((self = [super init])) {
- _matchBlock = Block_copy(matchBlock);
- _processBlock = Block_copy(processBlock);
+ _matchBlock = [matchBlock copy];
+ _processBlock = [processBlock copy];
}
return self;
}
- (void)dealloc {
- Block_release(_matchBlock);
- Block_release(_processBlock);
+ ARC_RELEASE(_matchBlock);
+ ARC_RELEASE(_processBlock);
- [super dealloc];
+ ARC_DEALLOC(super);
}
@end
@@ -140,16 +140,16 @@
[self stop];
}
- [_handlers release];
+ ARC_RELEASE(_handlers);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)handlerBlock {
DCHECK(_source == NULL);
GCDWebServerHandler* handler = [[GCDWebServerHandler alloc] initWithMatchBlock:matchBlock processBlock:handlerBlock];
[_handlers insertObject:handler atIndex:0];
- [handler release];
+ ARC_RELEASE(handler);
}
- (void)removeAllHandlers {
@@ -212,8 +212,12 @@
NSData* data = [NSData dataWithBytes:&addr length:addrlen];
Class connectionClass = [[self class] connectionClass];
- GCDWebServerConnection* connection = [[connectionClass alloc] initWithServer:self address:data socket:socket];
- [connection release]; // Connection will automatically retain itself while opened
+ GCDWebServerConnection* connection = [[connectionClass alloc] initWithServer:self address:data socket:socket]; // Connection will automatically retain itself while opened
+#if __has_feature(objc_arc)
+ [connection self]; // Prevent compiler from complaining about unused variable / useless statement
+#else
+ [connection release];
+#endif
} else {
LOG_ERROR(@"Failed accepting socket (%i): %s", errno, strerror(errno));
}
@@ -235,9 +239,9 @@
}
if (name) {
- _service = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), CFSTR("_http._tcp"), (CFStringRef)name, _port);
+ _service = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), CFSTR("_http._tcp"), (ARC_BRIDGE CFStringRef)name, _port);
if (_service) {
- CFNetServiceClientContext context = {0, self, NULL, NULL, NULL};
+ CFNetServiceClientContext context = {0, (ARC_BRIDGE void*)self, NULL, NULL, NULL};
CFNetServiceSetClient(_service, _NetServiceClientCallBack, &context);
CFNetServiceScheduleWithRunLoop(_service, CFRunLoopGetMain(), kCFRunLoopCommonModes);
CFStreamError error = {0};
@@ -326,7 +330,7 @@
- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)class processBlock:(GCDWebServerProcessBlock)block {
[self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {
- return [[[class alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery] autorelease];
+ return ARC_AUTORELEASE([[class alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]);
} processBlock:block];
}
@@ -363,6 +367,11 @@
- (void)addHandlerForBasePath:(NSString*)basePath localPath:(NSString*)localPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge {
if ([basePath hasPrefix:@"/"] && [basePath hasSuffix:@"/"]) {
+#if __has_feature(objc_arc)
+ __unsafe_unretained GCDWebServer* server = self;
+#else
+ GCDWebServer* server = self;
+#endif
[self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {
if (![requestMethod isEqualToString:@"GET"]) {
@@ -371,7 +380,7 @@
if (![urlPath hasPrefix:basePath]) {
return nil;
}
- return [[[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery] autorelease];
+ return ARC_AUTORELEASE([[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]);
} processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
@@ -383,12 +392,12 @@
if (indexFilename) {
NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename];
if ([[NSFileManager defaultManager] fileExistsAtPath:indexPath isDirectory:&isDirectory] && !isDirectory) {
- return [self _responseWithContentsOfFile:indexPath];
+ return [server _responseWithContentsOfFile:indexPath];
}
}
- response = [self _responseWithContentsOfDirectory:filePath];
+ response = [server _responseWithContentsOfDirectory:filePath];
} else {
- response = [self _responseWithContentsOfFile:filePath];
+ response = [server _responseWithContentsOfFile:filePath];
}
}
if (response) {
@@ -414,7 +423,7 @@
if ([urlPath caseInsensitiveCompare:path] != NSOrderedSame) {
return nil;
}
- return [[[class alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery] autorelease];
+ return ARC_AUTORELEASE([[class alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]);
} processBlock:block];
} else {
@@ -433,7 +442,7 @@
if ([expression firstMatchInString:urlPath options:0 range:NSMakeRange(0, urlPath.length)] == nil) {
return nil;
}
- return [[[class alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery] autorelease];
+ return ARC_AUTORELEASE([[class alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]);
} processBlock:block];
} else {
diff --git a/CGDWebServer/GCDWebServerConnection.m b/CGDWebServer/GCDWebServerConnection.m
index 5d71d17..e93e9c5 100644
--- a/CGDWebServer/GCDWebServerConnection.m
+++ b/CGDWebServer/GCDWebServerConnection.m
@@ -84,7 +84,7 @@
return true;
});
block(data);
- [data release];
+ ARC_RELEASE(data);
} else {
block(nil);
}
@@ -190,9 +190,15 @@
}
- (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block {
+#if !__has_feature(objc_arc)
[data retain];
+#endif
dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_current_queue(), ^{
+#if __has_feature(objc_arc)
+ [data self]; // Keeps ARC from releasing data too early
+#else
[data release];
+#endif
});
[self _writeBuffer:buffer withCompletionBlock:block];
dispatch_release(buffer);
@@ -201,7 +207,7 @@
- (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block {
DCHECK(_responseMessage);
CFDataRef message = CFHTTPMessageCopySerializedMessage(_responseMessage);
- [self _writeData:(NSData*)message withCompletionBlock:block];
+ [self _writeData:(ARC_BRIDGE NSData*)message withCompletionBlock:block];
CFRelease(message);
}
@@ -245,7 +251,11 @@
}
if (_continueData == nil) {
CFHTTPMessageRef message = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 100, NULL, kCFHTTPVersion1_1);
+#if __has_feature(objc_arc)
+ _continueData = CFBridgingRelease(CFHTTPMessageCopySerializedMessage(message));
+#else
_continueData = (NSData*)CFHTTPMessageCopySerializedMessage(message);
+#endif
CFRelease(message);
DCHECK(_continueData);
}
@@ -253,7 +263,7 @@
_dateFormatter = [[NSDateFormatter alloc] init];
_dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
_dateFormatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'";
- _dateFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
+ _dateFormatter.locale = ARC_AUTORELEASE([[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]);
DCHECK(_dateFormatter);
}
if (_formatterQueue == NULL) {
@@ -265,10 +275,10 @@
- (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode {
_responseMessage = CFHTTPMessageCreateResponse(kCFAllocatorDefault, statusCode, NULL, kCFHTTPVersion1_1);
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Connection"), CFSTR("Close"));
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Server"), (CFStringRef)[[_server class] serverName]);
+ CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Server"), (ARC_BRIDGE CFStringRef)[[_server class] serverName]);
dispatch_sync(_formatterQueue, ^{
NSString* date = [_dateFormatter stringFromDate:[NSDate date]];
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Date"), (CFStringRef)date);
+ CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Date"), (ARC_BRIDGE CFStringRef)date);
});
}
@@ -288,23 +298,23 @@
GCDWebServerResponse* response = [self processRequest:_request withBlock:_handler.processBlock];
if (![response hasBody] || [response open]) {
- _response = [response retain];
+ _response = ARC_RETAIN(response);
}
if (_response) {
[self _initializeResponseHeadersWithStatusCode:_response.statusCode];
NSUInteger maxAge = _response.cacheControlMaxAge;
if (maxAge > 0) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Cache-Control"), (CFStringRef)[NSString stringWithFormat:@"max-age=%i, public", (int)maxAge]);
+ CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Cache-Control"), (ARC_BRIDGE CFStringRef)[NSString stringWithFormat:@"max-age=%i, public", (int)maxAge]);
} else {
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Cache-Control"), CFSTR("no-cache"));
}
[_response.additionalHeaders enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL* stop) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, (CFStringRef)key, (CFStringRef)obj);
+ CFHTTPMessageSetHeaderFieldValue(_responseMessage, (ARC_BRIDGE CFStringRef)key, (ARC_BRIDGE CFStringRef)obj);
}];
if ([_response hasBody]) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Content-Type"), (CFStringRef)_response.contentType);
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Content-Length"), (CFStringRef)[NSString stringWithFormat:@"%i", (int)_response.contentLength]);
+ CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Content-Type"), (ARC_BRIDGE CFStringRef)_response.contentType);
+ CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Content-Length"), (ARC_BRIDGE CFStringRef)[NSString stringWithFormat:@"%i", (int)_response.contentLength]);
}
[self _writeHeadersWithCompletionBlock:^(BOOL success) {
@@ -373,22 +383,22 @@
[self _readHeadersWithCompletionBlock:^(NSData* extraData) {
if (extraData) {
- NSString* requestMethod = [[(id)CFHTTPMessageCopyRequestMethod(_requestMessage) autorelease] uppercaseString];
+ NSString* requestMethod = [ARC_BRIDGE_RELEASE(CFHTTPMessageCopyRequestMethod(_requestMessage)) uppercaseString];
DCHECK(requestMethod);
- NSURL* requestURL = [(id)CFHTTPMessageCopyRequestURL(_requestMessage) autorelease];
+ NSURL* requestURL = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyRequestURL(_requestMessage));
DCHECK(requestURL);
- NSString* requestPath = GCDWebServerUnescapeURLString([(id)CFURLCopyPath((CFURLRef)requestURL) autorelease]); // Don't use -[NSURL path] which strips the ending slash
+ NSString* requestPath = GCDWebServerUnescapeURLString(ARC_BRIDGE_RELEASE(CFURLCopyPath((CFURLRef)requestURL))); // Don't use -[NSURL path] which strips the ending slash
DCHECK(requestPath);
NSDictionary* requestQuery = nil;
- NSString* queryString = [(id)CFURLCopyQueryString((CFURLRef)requestURL, NULL) autorelease]; // Don't use -[NSURL query] to make sure query is not unescaped;
+ NSString* queryString = ARC_BRIDGE_RELEASE(CFURLCopyQueryString((CFURLRef)requestURL, NULL)); // Don't use -[NSURL query] to make sure query is not unescaped;
if (queryString.length) {
requestQuery = GCDWebServerParseURLEncodedForm(queryString);
DCHECK(requestQuery);
}
- NSDictionary* requestHeaders = [(id)CFHTTPMessageCopyAllHeaderFields(_requestMessage) autorelease];
+ NSDictionary* requestHeaders = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyAllHeaderFields(_requestMessage));
DCHECK(requestHeaders);
for (_handler in _server.handlers) {
- _request = [_handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery) retain];
+ _request = ARC_RETAIN(_handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery));
if (_request) {
break;
}
@@ -396,7 +406,7 @@
if (_request) {
if (_request.hasBody) {
if (extraData.length <= _request.contentLength) {
- NSString* expectHeader = [(id)CFHTTPMessageCopyHeaderFieldValue(_requestMessage, CFSTR("Expect")) autorelease];
+ NSString* expectHeader = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyHeaderFieldValue(_requestMessage, CFSTR("Expect")));
if (expectHeader) {
if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) {
[self _writeData:_continueData withCompletionBlock:^(BOOL success) {
@@ -432,8 +442,8 @@
- (id)initWithServer:(GCDWebServer*)server address:(NSData*)address socket:(CFSocketNativeHandle)socket {
if ((self = [super init])) {
- _server = [server retain];
- _address = [address retain];
+ _server = ARC_RETAIN(server);
+ _address = ARC_RETAIN(address);
_socket = socket;
[self open];
@@ -444,20 +454,20 @@
- (void)dealloc {
[self close];
- [_server release];
- [_address release];
+ ARC_RELEASE(_server);
+ ARC_RELEASE(_address);
if (_requestMessage) {
CFRelease(_requestMessage);
}
- [_request release];
+ ARC_RELEASE(_request);
if (_responseMessage) {
CFRelease(_responseMessage);
}
- [_response release];
+ ARC_RELEASE(_response);
- [super dealloc];
+ ARC_DEALLOC(super);
}
@end
diff --git a/CGDWebServer/GCDWebServerPrivate.h b/CGDWebServer/GCDWebServerPrivate.h
index f20f2d9..8660564 100644
--- a/CGDWebServer/GCDWebServerPrivate.h
+++ b/CGDWebServer/GCDWebServerPrivate.h
@@ -25,6 +25,22 @@
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#if __has_feature(objc_arc)
+#define ARC_BRIDGE __bridge
+#define ARC_BRIDGE_RELEASE(__OBJECT__) CFBridgingRelease(__OBJECT__)
+#define ARC_RETAIN(__OBJECT__) __OBJECT__
+#define ARC_RELEASE(__OBJECT__)
+#define ARC_AUTORELEASE(__OBJECT__) __OBJECT__
+#define ARC_DEALLOC(__OBJECT__)
+#else
+#define ARC_BRIDGE
+#define ARC_BRIDGE_RELEASE(__OBJECT__) [(id)__OBJECT__ autorelease]
+#define ARC_RETAIN(__OBJECT__) [__OBJECT__ retain]
+#define ARC_RELEASE(__OBJECT__) [__OBJECT__ release]
+#define ARC_AUTORELEASE(__OBJECT__) [__OBJECT__ autorelease]
+#define ARC_DEALLOC(__OBJECT__) [__OBJECT__ dealloc]
+#endif
+
#import "GCDWebServerConnection.h"
#ifdef __GCDWEBSERVER_LOGGING_HEADER__
@@ -47,7 +63,7 @@
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];
va_end(arguments);
printf("[%s] %s\n", levelNames[level], [message UTF8String]);
- [message release];
+ ARC_RELEASE(message);
}
}
diff --git a/CGDWebServer/GCDWebServerRequest.m b/CGDWebServer/GCDWebServerRequest.m
index b57f93e..00ce5f9 100644
--- a/CGDWebServer/GCDWebServerRequest.m
+++ b/CGDWebServer/GCDWebServerRequest.m
@@ -54,7 +54,7 @@
[scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:&value];
}
}
- [scanner release];
+ ARC_RELEASE(scanner);
}
return value;
}
@@ -75,16 +75,16 @@
- (id)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query {
if ((self = [super init])) {
_method = [method copy];
- _url = [url retain];
- _headers = [headers retain];
+ _url = ARC_RETAIN(url);
+ _headers = ARC_RETAIN(headers);
_path = [path copy];
- _query = [query retain];
+ _query = ARC_RETAIN(query);
- _type = [[_headers objectForKey:@"Content-Type"] retain];
+ _type = ARC_RETAIN([_headers objectForKey:@"Content-Type"]);
NSInteger length = [[_headers objectForKey:@"Content-Length"] integerValue];
if (length < 0) {
DNOT_REACHED();
- [self release];
+ ARC_RELEASE(self);
return nil;
}
_length = length;
@@ -97,14 +97,14 @@
}
- (void)dealloc {
- [_method release];
- [_url release];
- [_headers release];
- [_path release];
- [_query release];
- [_type release];
+ ARC_RELEASE(_method);
+ ARC_RELEASE(_url);
+ ARC_RELEASE(_headers);
+ ARC_RELEASE(_path);
+ ARC_RELEASE(_query);
+ ARC_RELEASE(_type);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (BOOL)hasBody {
@@ -138,9 +138,9 @@
- (void)dealloc {
DCHECK(_data != nil);
- [_data release];
+ ARC_RELEASE(_data);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (BOOL)open {
@@ -168,7 +168,7 @@
- (id)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query {
if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) {
- _filePath = [[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]] retain];
+ _filePath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]);
}
return self;
}
@@ -176,9 +176,9 @@
- (void)dealloc {
DCHECK(_file < 0);
unlink([_filePath fileSystemRepresentation]);
- [_filePath release];
+ ARC_RELEASE(_filePath);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (BOOL)open {
@@ -210,9 +210,9 @@
}
- (void)dealloc {
- [_arguments release];
+ ARC_RELEASE(_arguments);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (BOOL)close {
@@ -222,8 +222,8 @@
NSString* charset = _ExtractHeaderParameter(self.contentType, @"charset");
NSString* string = [[NSString alloc] initWithData:self.data encoding:_StringEncodingFromCharset(charset)];
- _arguments = [GCDWebServerParseURLEncodedForm(string) retain];
- [string release];
+ _arguments = ARC_RETAIN(GCDWebServerParseURLEncodedForm(string));
+ ARC_RELEASE(string);
return (_arguments ? YES : NO);
}
@@ -239,7 +239,7 @@
_contentType = [contentType copy];
NSArray* components = [_contentType componentsSeparatedByString:@";"];
if (components.count) {
- _mimeType = [[[components objectAtIndex:0] lowercaseString] retain];
+ _mimeType = ARC_RETAIN([[components objectAtIndex:0] lowercaseString]);
}
if (_mimeType == nil) {
_mimeType = @"text/plain";
@@ -249,10 +249,10 @@
}
- (void)dealloc {
- [_contentType release];
- [_mimeType release];
+ ARC_RELEASE(_contentType);
+ ARC_RELEASE(_mimeType);
- [super dealloc];
+ ARC_DEALLOC(super);
}
@end
@@ -263,7 +263,7 @@
- (id)initWithContentType:(NSString*)contentType data:(NSData*)data {
if ((self = [super initWithContentType:contentType])) {
- _data = [data retain];
+ _data = ARC_RETAIN(data);
if ([self.mimeType hasPrefix:@"text/"]) {
NSString* charset = _ExtractHeaderParameter(self.contentType, @"charset");
@@ -274,10 +274,10 @@
}
- (void)dealloc {
- [_data release];
- [_string release];
+ ARC_RELEASE(_data);
+ ARC_RELEASE(_string);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (NSString*)description {
@@ -301,10 +301,10 @@
- (void)dealloc {
unlink([_temporaryPath fileSystemRepresentation]);
- [_fileName release];
- [_temporaryPath release];
+ ARC_RELEASE(_fileName);
+ ARC_RELEASE(_temporaryPath);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (NSString*)description {
@@ -340,11 +340,12 @@
if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) {
NSString* boundary = _ExtractHeaderParameter(self.contentType, @"boundary");
if (boundary) {
- _boundary = [[[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSASCIIStringEncoding] retain];
+ NSData* data = [[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSASCIIStringEncoding];
+ _boundary = ARC_RETAIN(data);
}
if (_boundary == nil) {
DNOT_REACHED();
- [self release];
+ ARC_RELEASE(self);
return nil;
}
@@ -369,13 +370,13 @@
NSRange range = [_parserData rangeOfData:_newlinesData options:0 range:NSMakeRange(0, _parserData.length)];
if (range.location != NSNotFound) {
- [_controlName release];
+ ARC_RELEASE(_controlName);
_controlName = nil;
- [_fileName release];
+ ARC_RELEASE(_fileName);
_fileName = nil;
- [_contentType release];
+ ARC_RELEASE(_contentType);
_contentType = nil;
- [_tmpPath release];
+ ARC_RELEASE(_tmpPath);
_tmpPath = nil;
CFHTTPMessageRef message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true);
const char* temp = "GET / HTTP/1.0\r\n";
@@ -384,7 +385,7 @@
if (CFHTTPMessageIsHeaderComplete(message)) {
NSString* controlName = nil;
NSString* fileName = nil;
- NSDictionary* headers = [(id)CFHTTPMessageCopyAllHeaderFields(message) autorelease];
+ NSDictionary* headers = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyAllHeaderFields(message));
NSString* contentDisposition = [headers objectForKey:@"Content-Disposition"];
if ([[contentDisposition lowercaseString] hasPrefix:@"form-data;"]) {
controlName = _ExtractHeaderParameter(contentDisposition, @"name");
@@ -392,7 +393,7 @@
}
_controlName = [controlName copy];
_fileName = [fileName copy];
- _contentType = [[headers objectForKey:@"Content-Type"] retain];
+ _contentType = ARC_RETAIN([headers objectForKey:@"Content-Type"]);
}
CFRelease(message);
if (_controlName) {
@@ -434,7 +435,7 @@
_tmpFile = 0;
GCDWebServerMultiPartFile* file = [[GCDWebServerMultiPartFile alloc] initWithContentType:_contentType fileName:_fileName temporaryPath:_tmpPath];
[_files setObject:file forKey:_controlName];
- [file release];
+ ARC_RELEASE(file);
} else {
DNOT_REACHED();
success = NO;
@@ -443,14 +444,14 @@
DNOT_REACHED();
success = NO;
}
- [_tmpPath release];
+ ARC_RELEASE(_tmpPath);
_tmpPath = nil;
} else {
NSData* data = [[NSData alloc] initWithBytesNoCopy:(void*)dataBytes length:dataLength freeWhenDone:NO];
GCDWebServerMultiPartArgument* argument = [[GCDWebServerMultiPartArgument alloc] initWithContentType:_contentType data:data];
[_arguments setObject:argument forKey:_controlName];
- [argument release];
- [data release];
+ ARC_RELEASE(argument);
+ ARC_RELEASE(data);
}
}
@@ -487,26 +488,31 @@
- (BOOL)close {
DCHECK(_parserData != nil);
- [_parserData release];
+ ARC_RELEASE(_parserData);
_parserData = nil;
- [_controlName release];
- [_fileName release];
- [_contentType release];
+ ARC_RELEASE(_controlName);
+ _controlName = nil;
+ ARC_RELEASE(_fileName);
+ _fileName = nil;
+ ARC_RELEASE(_contentType);
+ _contentType = nil;
if (_tmpFile > 0) {
close(_tmpFile);
unlink([_tmpPath fileSystemRepresentation]);
+ _tmpFile = 0;
}
- [_tmpPath release];
+ ARC_RELEASE(_tmpPath);
+ _tmpPath = nil;
return (_parserState == kParserState_End ? YES : NO);
}
- (void)dealloc {
DCHECK(_parserData == nil);
- [_arguments release];
- [_files release];
- [_boundary release];
+ ARC_RELEASE(_arguments);
+ ARC_RELEASE(_files);
+ ARC_RELEASE(_boundary);
- [super dealloc];
+ ARC_DEALLOC(super);
}
@end
diff --git a/CGDWebServer/GCDWebServerResponse.m b/CGDWebServer/GCDWebServerResponse.m
index 069fd30..a820ad3 100644
--- a/CGDWebServer/GCDWebServerResponse.m
+++ b/CGDWebServer/GCDWebServerResponse.m
@@ -33,8 +33,8 @@
@synthesize contentType=_type, contentLength=_length, statusCode=_status, cacheControlMaxAge=_maxAge, additionalHeaders=_headers;
-+(GCDWebServerResponse*) response {
- return [[[[self class] alloc] init] autorelease];
++ (GCDWebServerResponse*)response {
+ return ARC_AUTORELEASE([[[self class] alloc] init]);
}
- (id)init {
@@ -57,10 +57,10 @@
}
- (void)dealloc {
- [_type release];
- [_headers release];
+ ARC_RELEASE(_type);
+ ARC_RELEASE(_headers);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header {
@@ -95,11 +95,11 @@
@implementation GCDWebServerResponse (Extensions)
+ (GCDWebServerResponse*)responseWithStatusCode:(NSInteger)statusCode {
- return [[[self alloc] initWithStatusCode:statusCode] autorelease];
+ return ARC_AUTORELEASE([[self alloc] initWithStatusCode:statusCode]);
}
+ (GCDWebServerResponse*)responseWithRedirect:(NSURL*)location permanent:(BOOL)permanent {
- return [[[self alloc] initWithRedirect:location permanent:permanent] autorelease];
+ return ARC_AUTORELEASE([[self alloc] initWithRedirect:location permanent:permanent]);
}
- (id)initWithStatusCode:(NSInteger)statusCode {
@@ -122,18 +122,18 @@
@implementation GCDWebServerDataResponse
+ (GCDWebServerDataResponse*)responseWithData:(NSData*)data contentType:(NSString*)type {
- return [[[[self class] alloc] initWithData:data contentType:type] autorelease];
+ return ARC_AUTORELEASE([[[self class] alloc] initWithData:data contentType:type]);
}
- (id)initWithData:(NSData*)data contentType:(NSString*)type {
if (data == nil) {
DNOT_REACHED();
- [self release];
+ ARC_RELEASE(self);
return nil;
}
if ((self = [super initWithContentType:type contentLength:data.length])) {
- _data = [data retain];
+ _data = ARC_RETAIN(data);
_offset = -1;
}
return self;
@@ -141,9 +141,9 @@
- (void)dealloc {
DCHECK(_offset < 0);
- [_data release];
+ ARC_RELEASE(_data);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (BOOL)open {
@@ -174,22 +174,22 @@
@implementation GCDWebServerDataResponse (Extensions)
+ (GCDWebServerDataResponse*)responseWithText:(NSString*)text {
- return [[[self alloc] initWithText:text] autorelease];
+ return ARC_AUTORELEASE([[self alloc] initWithText:text]);
}
+ (GCDWebServerDataResponse*)responseWithHTML:(NSString*)html {
- return [[[self alloc] initWithHTML:html] autorelease];
+ return ARC_AUTORELEASE([[self alloc] initWithHTML:html]);
}
+ (GCDWebServerDataResponse*)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables {
- return [[[self alloc] initWithHTMLTemplate:path variables:variables] autorelease];
+ return ARC_AUTORELEASE([[self alloc] initWithHTMLTemplate:path variables:variables]);
}
- (id)initWithText:(NSString*)text {
NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];
if (data == nil) {
DNOT_REACHED();
- [self release];
+ ARC_RELEASE(self);
return nil;
}
return [self initWithData:data contentType:@"text/plain; charset=utf-8"];
@@ -199,7 +199,7 @@
NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];
if (data == nil) {
DNOT_REACHED();
- [self release];
+ ARC_RELEASE(self);
return nil;
}
return [self initWithData:data contentType:@"text/html; charset=utf-8"];
@@ -211,7 +211,7 @@
[html replaceOccurrencesOfString:[NSString stringWithFormat:@"%%%@%%", key] withString:value options:0 range:NSMakeRange(0, html.length)];
}];
id response = [self initWithHTML:html];
- [html release];
+ ARC_RELEASE(html);
return response;
}
@@ -220,11 +220,11 @@
@implementation GCDWebServerFileResponse
+ (GCDWebServerFileResponse*)responseWithFile:(NSString*)path {
- return [[[[self class] alloc] initWithFile:path] autorelease];
+ return ARC_AUTORELEASE([[[self class] alloc] initWithFile:path]);
}
+ (GCDWebServerFileResponse*)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment {
- return [[[[self class] alloc] initWithFile:path isAttachment:attachment] autorelease];
+ return ARC_AUTORELEASE([[[self class] alloc] initWithFile:path isAttachment:attachment]);
}
- (id)initWithFile:(NSString*)path {
@@ -235,7 +235,7 @@
struct stat info;
if (lstat([path fileSystemRepresentation], &info) || !(info.st_mode & S_IFREG)) {
DNOT_REACHED();
- [self release];
+ ARC_RELEASE(self);
return nil;
}
NSString* type = GCDWebServerGetMimeTypeForExtension([path pathExtension]);
@@ -250,7 +250,7 @@
NSString* fileName = data ? [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding] : nil;
if (fileName) {
[self setValue:[NSString stringWithFormat:@"attachment; filename=\"%@\"", fileName] forAdditionalHeader:@"Content-Disposition"];
- [fileName release];
+ ARC_RELEASE(fileName);
} else {
DNOT_REACHED();
}
@@ -261,9 +261,9 @@
- (void)dealloc {
DCHECK(_file <= 0);
- [_path release];
+ ARC_RELEASE(_path);
- [super dealloc];
+ ARC_DEALLOC(super);
}
- (BOOL)open {
diff --git a/GCDWebServer.xcodeproj/project.pbxproj b/GCDWebServer.xcodeproj/project.pbxproj
index 21032ed..aa68235 100644
--- a/GCDWebServer.xcodeproj/project.pbxproj
+++ b/GCDWebServer.xcodeproj/project.pbxproj
@@ -6,6 +6,21 @@
objectVersion = 46;
objects = {
+/* Begin PBXAggregateTarget section */
+ E274F876187E77D8009E0582 /* Build All */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = E274F879187E77D8009E0582 /* Build configuration list for PBXAggregateTarget "Build All" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E274F87D187E77E5009E0582 /* PBXTargetDependency */,
+ E274F87B187E77E3009E0582 /* PBXTargetDependency */,
+ );
+ name = "Build All";
+ productName = "Build All";
+ };
+/* End PBXAggregateTarget section */
+
/* Begin PBXBuildFile section */
E208D149167B76B700500836 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D148167B76B700500836 /* CFNetwork.framework */; };
E208D1B3167BB17E00500836 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D1B2167BB17E00500836 /* CoreServices.framework */; };
@@ -25,6 +40,23 @@
E221129D1690B7BA0048D2B2 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */; };
/* End PBXBuildFile section */
+/* Begin PBXContainerItemProxy section */
+ E274F87A187E77E3009E0582 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 8DD76FA90486AB0100D96B5E;
+ remoteInfo = "GCDWebServer (Mac)";
+ };
+ E274F87C187E77E5009E0582 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E22112591690B4DE0048D2B2;
+ remoteInfo = "GCDWebServer (iOS)";
+ };
+/* End PBXContainerItemProxy section */
+
/* Begin PBXFileReference section */
8DD76FB20486AB0100D96B5E /* GCDWebServer */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GCDWebServer; sourceTree = BUILT_PRODUCTS_DIR; };
E208D148167B76B700500836 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };
@@ -207,6 +239,7 @@
projectDirPath = "";
projectRoot = "";
targets = (
+ E274F876187E77D8009E0582 /* Build All */,
8DD76FA90486AB0100D96B5E /* GCDWebServer (Mac) */,
E22112591690B4DE0048D2B2 /* GCDWebServer (iOS) */,
);
@@ -241,11 +274,23 @@
};
/* End PBXSourcesBuildPhase section */
+/* Begin PBXTargetDependency section */
+ E274F87B187E77E3009E0582 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 8DD76FA90486AB0100D96B5E /* GCDWebServer (Mac) */;
+ targetProxy = E274F87A187E77E3009E0582 /* PBXContainerItemProxy */;
+ };
+ E274F87D187E77E5009E0582 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E22112591690B4DE0048D2B2 /* GCDWebServer (iOS) */;
+ targetProxy = E274F87C187E77E5009E0582 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
/* Begin XCBuildConfiguration section */
1DEB928608733DD80010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
MACOSX_DEPLOYMENT_TARGET = 10.7;
PRODUCT_NAME = GCDWebServer;
SDKROOT = macosx;
@@ -255,7 +300,6 @@
1DEB928708733DD80010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
MACOSX_DEPLOYMENT_TARGET = 10.7;
PRODUCT_NAME = GCDWebServer;
SDKROOT = macosx;
@@ -265,6 +309,7 @@
1DEB928A08733DD80010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_ARC = YES;
GCC_OPTIMIZATION_LEVEL = 0;
ONLY_ACTIVE_ARCH = YES;
WARNING_CFLAGS = "-Wall";
@@ -274,10 +319,8 @@
1DEB928B08733DD80010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- GCC_PREPROCESSOR_DEFINITIONS = (
- NDEBUG,
- NS_BLOCK_ASSERTIONS,
- );
+ CLANG_ENABLE_OBJC_ARC = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = NDEBUG;
WARNING_CFLAGS = "-Wall";
};
name = Release;
@@ -308,6 +351,20 @@
};
name = Release;
};
+ E274F877187E77D8009E0582 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ E274F878187E77D8009E0582 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -338,6 +395,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ E274F879187E77D8009E0582 /* Build configuration list for PBXAggregateTarget "Build All" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E274F877187E77D8009E0582 /* Debug */,
+ E274F878187E77D8009E0582 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
/* End XCConfigurationList section */
};
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
diff --git a/Mac/main.m b/Mac/main.m
index 49e7f58..a84ad33 100644
--- a/Mac/main.m
+++ b/Mac/main.m
@@ -81,7 +81,9 @@
}
success = [webServer runWithPort:8080];
+#if !__has_feature(objc_arc)
[webServer release];
+#endif
}
return success ? 0 : -1;
}
diff --git a/iOS/AppDelegate.m b/iOS/AppDelegate.m
index 651e429..c05822c 100644
--- a/iOS/AppDelegate.m
+++ b/iOS/AppDelegate.m
@@ -29,12 +29,16 @@
@implementation AppDelegate
+#if !__has_feature(objc_arc)
+
- (void)dealloc {
[_window release];
[super dealloc];
}
+#endif
+
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
_window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_window.backgroundColor = [UIColor whiteColor];