ios个人笔记

图片转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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值