图片转base64
UIImage *image = [UIImage imageNamed:@"s"];
NSData *data = UIImageJPEGRepresentation(image, 1.0f);
NSString *str = [data base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSData *data = [NSData alloc]initWithBase64EncodedData:<#(NSData *)#> options:<#(NSDataBase64DecodingOptions)#>;
UIImage *image = [UIImage imageWithData:<#(NSData *)#>];
+++++++++++++++++++++++++++++++++++++++++++++++
ARC
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *viewController = [[ViewController alloc] init];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
// Override point for customization after application launch.
return YES;
}
afnetworking
asihttprequest
SDWebImage
SDWebImageCompat.m
ARC主要提供了4种修饰符,他们分别是:__strong,__weak,__autoreleasing,__unsafe_unretained。
定义property时不能使用__autoreleasing
修饰符,任何一个对象的property都不应该是autorelease型的
NSString *str = [[[NSString alloc] initWithFormat:@"hehe"] autorelease]; // MRC
等价于 NSString *__autoreleasing str = [[NSString alloc] initWithFormat:@"hehe"]; // ARC
__autoreleasing在ARC中主要用在参数传递返回值(out-parameters)和引用传递参数(pass-by-reference)的情况下。
1 | NSError *__autoreleasing error; |
在这里,加上__autoreleasing之后,相当于在MRC中对返回值error做了如下事情:
1 | *error = [[[NSError alloc] init] autorelease]; |
*error指向的对象在创建出来后,被放入到了autoreleasing pool中,等待使用结束后的自动释放,函数外error的使用者并不需要关心*error指向对象的释放。
MyViewController *myController = [[MyViewController alloc] init…];
// 隐式地调用[myController retain];造成循环引用
myController.completionHandler = ^(NSInteger result) {
[myController dismissViewControllerAnimated:YES completion:nil];
};
[self presentViewController:myController animated:YES completion:^{
[myController release]; // 注意,这里调用[myController release];是在MRC中的一个常规写法,并不能解决上面循环引用的问题
}];
在这段代码中,myController的completionHandler调用了myController的方法[dismissViewController...],这时completionHandler会对myController做retain操作。而我们知道,myController对completionHandler也至少有一个retain(一般准确讲是copy),这时就出现了在内存管理中最糟糕的情况:循环引用!简单点说就是:myController retain了completionHandler,而completionHandler也retain了myController。循环引用导致了myController和completionHandler最终都不能被释放。我们在delegate关系中,对delegate指针用weak就是为了避免这种问题。
对这种情况,我们一般用如下方法解决:给要进入Block的指针加一个__block修饰符。
MyViewController * __block myController = [[MyViewController alloc] init…];
// ...
myController.completionHandler = ^(NSInteger result) {
[myController dismissViewControllerAnimated:YES completion:nil];
};
//之后正常的release或者retain
这个__block在MRC时代有两个作用:
- 说明变量可改
- 说明指针指向的对象不做这个隐式的retain操作
一个变量如果不加__block,是不能在Block里面修改的,不过这里有一个例外:static的变量和全局变量不需要加__block就可以在Block中修改。
- 打开ARC:-fobjc-arc
- 关闭ARC:-fno-objc-arc
-fno-objc-arc
-ObjC
-fobjc-arc
-fobjc-arc
#import "SDWebImageCompat.h"
#import "SDWebImageOperation.h"
#import "SDWebImageDownloader.h"
#import "SDImageCache.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *viewController = [[ViewController alloc] init];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
// Override point for customization after application launch.
return YES;
}
afnetworking
asihttprequest
SDWebImage
SDWebImageCompat.m
-fno-objc-arc
-ObjC
-fobjc-arc
-fobjc-arc
#import "SDWebImageCompat.h"
#import "SDWebImageOperation.h"
#import "SDWebImageDownloader.h"
#import "SDImageCache.h"