IOS开发基础知识--碎片28

1:通用的weakify和strongify

/**
* 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题
* 调用方式: `@weakify_self`实现弱引用转换,`@strongify_self`实现强引用转换
*
* 示例:
* @weakify_self
* [obj block:^{
* @strongify_self
* self.property = something;
* }];
*/
#ifndef    weakify_self
#if __has_feature(objc_arc)
#define weakify_self autoreleasepool{} __weak __typeof__(self) weakSelf = self;
#else
#define weakify_self autoreleasepool{} __block __typeof__(self) blockSelf = self;
#endif
#endif
#ifndef    strongify_self
#if __has_feature(objc_arc)
#define strongify_self try{} @finally{} __typeof__(weakSelf) self = weakSelf;
#else
#define strongify_self try{} @finally{} __typeof__(blockSelf) self = blockSelf;
#endif
#endif
/**
* 强弱引用转换,用于解决代码块(block)与强引用对象之间的循环引用问题
* 调用方式: `@weakify(object)`实现弱引用转换,`@strongify(object)`实现强引用转换
*
* 示例:
* @weakify(object)
* [obj block:^{
* @strongify(object)
* strong_object = something;
* }];
*/
#ifndef    weakify
#if __has_feature(objc_arc)
#define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
#else
#define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;
#endif
#endif
#ifndef    strongify
#if __has_feature(objc_arc)
#define strongify(object) try{} @finally{} __typeof__(object) strong##_##object = weak##_##object;
#else
#define strongify(object) try{} @finally{} __typeof__(object) strong##_##object = block##_##object;
#endif
#endif

 运用(这两个宏一定成对出现,先weak再strong):

@weakify(self); // 定义了一个__weak的self_weak_变量 
[RACObserve(self, name) subscribeNext:^(NSString *name) { 
    @strongify(self); // 局域定义了一个__strong的self指针指向self_weak 
    self.outputLabel.text = name; 
}]; 

 

2:objc runtime 动态增加属性

说明:给类扩展增加了一个新属性。通常下类扩展只允许添加方法。必须要先引入 objc/runtime.h,主要是下面两个方法:

赋值:

OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

获得值:

OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)

实例(引用):

UILabel+Associate.h


#import <UIKit/UIKit.h>

@interface UILabel (Associate)

- (void) setFlashColor:(UIColor *) flashColor;

- (UIColor *) getFlashColor;

@end



UILabel+Associate.m


#import "UILabel+Associate.h"
#import <objc/runtime.h>

@implementation UILabel (Associate)

static char flashColorKey;

- (void) setFlashColor:(UIColor *) flashColor{
    objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIColor *) getFlashColor{
   return objc_getAssociatedObject(self, &flashColorKey);
}

@end

调用代码:

    UILabel *lab = [[UILabel alloc] init];
    [lab setFlashColor:[UIColor redColor]];
    NSLog(@"%@", [lab getFlashColor]);

 

3:navigationController popToViewController跳转到上上层

        NSUInteger index=self.navigationController.viewControllers.count-3;
        [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:index] animated:YES];

如果动画是翻转页面,有可能是因为当前页面有键盘,可以先把键盘回收后,动作就变成正常的回退动画效果

 

4:App跳转到设置

             UIApplication *app = [UIApplication sharedApplication];
             NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
             if ([app canOpenURL:settingsURL]) {
                 [app openURL:settingsURL];
             }

 

跳转系统设置根目录中的项目使用如下的方法:

         _array = @[
               @{@"系统设置":@"prefs:root=INTERNET_TETHERING"},
               @{@"WIFI设置":@"prefs:root=WIFI"},
               @{@"蓝牙设置":@"prefs:root=Bluetooth"},
               @{@"系统通知":@"prefs:root=NOTIFICATIONS_ID"},
               @{@"通用设置":@"prefs:root=General"},
               @{@"显示设置":@"prefs:root=DISPLAY&BRIGHTNESS"},
               @{@"壁纸设置":@"prefs:root=Wallpaper"},
               @{@"声音设置":@"prefs:root=Sounds"},
               @{@"隐私设置":@"prefs:root=privacy"},
               @{@"APP Store":@"prefs:root=STORE"},
               @{@"Notes":@"prefs:root=NOTES"},
               @{@"Safari":@"prefs:root=Safari"},
               @{@"Music":@"prefs:root=MUSIC"},
               @{@"photo":@"prefs:root=Photos"}
               ];
        NSURL * url = [NSURL URLWithString:[_array[index] allValues].firstObject];
        [[UIApplication sharedApplication]openURL:url];
如果要跳转第三方应用的设置界面中,使用prefs:root=boundleId的方式,boundleId是第三方应用的boundleId。
        如果需要继续向项目内层进行跳转,可以通过添加path路径的方式,如下:

              _array = @[
               @{@"关于本机":@"prefs:root=General&path=About"},
               @{@"软件升级":@"prefs:root=General&path=SOFTWARE_UPDATE_LINK"},
               @{@"日期时间":@"prefs:root=General&path=DATE_AND_TIME"},
               @{@"Accessibility":@"prefs:root=General&path=ACCESSIBILITY"},
               @{@"键盘设置":@"prefs:root=General&path=Keyboard"},
               @{@"VPN":@"prefs:root=General&path=VPN"},
               @{@"壁纸设置":@"prefs:root=Wallpaper"},
               @{@"声音设置":@"prefs:root=Sounds"},
               @{@"隐私设置":@"prefs:root=privacy"},
               @{@"APP Store":@"prefs:root=STORE"},
               @{@"还原设置":@"prefs:root=General&path=Reset"},
               @{@"应用通知":@"prefs:root=NOTIFICATIONS_ID&path=应用的boundleId"}
               ];

 

5:ios时间戳13位转换

IOS的时间转为13位时间戳

//取当前时间的秒数,这边是到秒数
NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
//到毫秒数,则再*1000
long long curTime=[[NSDate date] timeIntervalSince1970]*1000;
//ios生成的时间戳是10位


13时间戳转为IOS的时间

NSString * timeStampString = @"1423189125874";
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeStampString doubleValue] / 1000];

或者

NSString * timeStampString = @"1423189125874";
   NSTimeInterval _interval=[[timeStampString substringToIndex:10] doubleValue];
   NSDate *date = [NSDate dateWithTimeIntervalSince1970:_interval];

 

6:iOS之整型(NSInteger)转换警告Values of type 'NSInteger' should not be used as format arguments;

苹果app支持arm64以后会有一个问题:NSInteger变成64位了,和原来的int (%d)不匹配,会报如下warning,

Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead

解决办法:
1、系统推荐方法   [NSString stringWithFormat:@“%ld", (long)number];

2、强制转换    [NSString stringWithFormat:@"%d", (int)number];

3、[NSString stringWithFormat:@“%@", @(number)];

 

7:本地语言添加文件(解决一些系统自带的Title为英语 比如Cannel Done等)

1:新建文件,Resource->Strings File 命名,

2:然后点击这个.strings 右边有个Localization->Localizeation,增加一个英语;

3:到Project-Info-Localizations 然后增加Chinses(Simplified) 选择.strings后就可以了

 

8:SDWebImage获得缓存大小,并对它进行清除

        float tmpSize = [[SDImageCache sharedImageCache] getSize];
        NSString *clearCacheName =@"当前缓存已清理";
        if (tmpSize>0) {
            clearCacheName=tmpSize >= 1 ? [NSString stringWithFormat:@"成功清理缓存(%.2fM)",tmpSize] : [NSString stringWithFormat:@"成功清理缓存(%.2fK)",tmpSize * 1024];
        }
        [[SDImageCache sharedImageCache] clearDisk];

说明:直接sd_setImageWithURL 就会有缓存

posted @ 2015-11-10 15:28  踏浪帅  阅读(765)  评论(0编辑  收藏  举报