我有点困惑UIGraphicsBeginImageContextWithOptions
和线程,因为根据UIKit函数引用 UIGraphicsBeginImageContextWithOptions
应该只在主线程上调用.调用时,它会创建一个基于位图的上下文,可以使用CoreGraphics的函数或者像drawInRect:
for UIImage
,-drawInRect:withFont:
for NSString
等等方法进行操作.对于CoreGraphics的绘图,一切都很清楚 - 您传递了一个CGContextRef参数,该参数被操作到每个函数,但UIKit绘图方法使用堆栈中的当前上下文.在iOS 4.0的新功能的发行说明中写道
在UIKit中绘制图形上下文现在是线程安全的.具体来说:
- 用于访问和操作图形
上下文的例程现在可以正确处理驻留在不同线程上的上下文.
- 字符串和图像绘制现在是线程安全的.
- 现在可以安全地使用多个线程中的颜色和字体对象.
到现在为止还挺好.有趣的是我有一个项目,在那里我做一些密集的绘图并通过创建上下文来创建多个图像UIGraphicsBeginImageContextWithOptions
,但是当这些操作碰巧更耗时并且我只是在后台线程中移动绘图并且在准备好显示时他们在屏幕上有一些动画,一切都很好 - 没有崩溃,没有泄漏.图像按预期绘制,似乎UIGraphicsBeginImageContextWithOptions
为后台线程创建了一个上下文,一切似乎都很好.
所以我的问题是:
- 为什么有必要UIGraphicsBeginImageContextWithOptions
只调用主线程,因为它似乎在后台工作正常?
- 如何使用UIImage
的-drawInRect:
方法,例如,在后台线程中,我没有当前上下文,我似乎无法创建一个因为我不能UIGraphicsBeginImageContextWithOptions
在那里调用?
- 使用UIKit方法进行背景图像处理的正确方法是什么(我知道我也可以使用CGBitmapContextCreate
,但它既不会将创建的上下文推送到上下文堆栈中,也不能自己为了使用-drawInRect:
方法而自行完成UIImage
)?
直到五分钟我才确定我对Objective c引用计数的理解非常好,但是当我开始检查对象retainCount时,我很惊讶地看到我所看到的.
例如,myViewController有一个UITableview:
.h文件
@interface RegularChatViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
{
UITableView *_tableView;
}
@property (nonatomic, retain) IBOutlet UITableView *tableView;
Run Code Online (Sandbox Code Playgroud)
.m文件
@synthesize tableView = _tableView;
- (void)loadView
{
_tableView = [[UITableView alloc] init]; // STEP ONE
NSLog(@"tableView retain count: %d",[_tableView retainCount]);
self.tableView.frame = CGRectMake(0, 0, 320, tableHeight); // STEP TWO
NSLog(@"tableView retain count: %d",[_tableView retainCount]);
[self.view addSubview:self.tableView]; // STEP THREE
NSLog(@"tableView retain count: %d",[_tableView retainCount]);
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,输入是:
tableView retain count: 1
tableView retain count: 2
tableView retain count: 3
Run Code Online (Sandbox Code Playgroud)
显然,STEP …
嗨我在php服务器上传图片,并在此代码的帮助下成功上传
- (NSString*)uploadData:(NSData *)data toURL:(NSString *)urlStr:(NSString *)_userID
{
// File upload code adapted from http://www.cocoadev.com/index.pl?HTTPFileUpload
// and http://www.cocoadev.com/index.pl?HTTPFileUploadSample
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlStr]];
[request setHTTPMethod:@"POST"];
// NSString* = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
NSString *stringBoundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
// [body appendData:[[NSString stringWithFormat:@"userId=%@",_userID] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"image%@.jpg\"\r\n", _userID] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:data]]; …
Run Code Online (Sandbox Code Playgroud) 我正在开发另一个带有画布的绘图应用程序,它比屏幕大很多倍.我需要一些建议/指导如何做到这一点.
基本上我想要的是滚动这个大画布,只在可见区域绘制.我在考虑两种方法:
如果这很重要,我正在使用cocos2d作为原型.