OC开发随笔

实在不知道这篇该怎么取标题,干脆就随意一点吧,随笔,嗯,挺好


1.view不接受事件情况:

  • userInteractionEnable 为NO
  • hidden为YES
  • alpha为0

知识点:
强烈推荐看看这篇文章,讲的真TMD好
链接地址


2.如果在数组中一定要存储nil, 那么只能用NSNull来代替


  • 在for-in快速枚举中, 不能够修改(增删)被枚举的对象(数组, 字典,集合) 同java

  • 《编写高质量iOS与OS X代码的52个有效方法》推荐我们用如下方式遍历:

- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);

4.NSArray提供的nice API

- (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");

// eg:
// 移除所有子view(就不用再for遍历删除了)
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

5.UIView里的哪些属性变化可以用动画呈现?
frame
bounds
对齐关系
alpha
背景色
内容拉伸
transform

折叠效果:动画改变fram 的height


6.初始化一个UIViewController

  • 通过StoryBoard初始化:
NSString* storyName = @"Main"; // 编辑器创建的默认Storyboard
NSString* viewControllerIdentifier = @""; // Storyboard id
UIViewController* vc = [[UIStoryboard  storyboardWithName:storyName bundle:nil]instantiateViewControllerWithIdentifier:viewControllerIdentifier];
  • 普通初始化:
 UIViewController* vc = [UIViewController new];
 UIViewController* vc = [[UIViewController alloc]init];

7.容器类

  • UINavigationController 以栈的形式存储UIViewController
    push(压栈)、pop(出栈)
  • UITabBarController 以数组的形式存储UIViewController
    可以根据index下标去拿对应的UIViewController

8.一些警报与报错

  • Sending 'ViewController const __strong' to parameter of incompatible type 'id<**Delegate>' 的警报

    解决方案:
    @interface (.h或者.m扩展类中)一行后面加上 <协议名>

  • unrecognized selector sent to instance

    没有此方法 或 对象已经释放

  • NSScanner: nil string argument

    有一次声明变量用了NSInteger* (注意这个指针星星)就报了这个错误,控制台打印的这个错我也是很郁闷(nil参数?太不人性了这个提示)网上的资料也没有我这种的,,,这里记录一下

  • Xcode编译出现Link错误,出现“duplicate symbols for architecture i386 clang”提示
    问题:链接时,项目有重名文件
    解决方案:
    1.在Xcode的Targets->Bulid Phases-Link Binary With Libraries中查看有无重复的lib
    2.全工程搜索下重名文件


9.如果NSArray中存储的是NSArray, NSDictionary, NSString, NSData, NSDate , NSNumber这些类型的对象, 那就可以直接写入disk并且读取disk的数据做持久化数据操作[array writeToURL:fileURL atomically:YES]
, 但是如果是有其他的类型, 就需要使用归档来实现了


  • 分类(category)定义的函数和属性在运行时中和原生的class中定义的东西并没有区别At runtime, there’s no difference between a method added by a category and one that is implemented by the original class
  • 类的扩展(有些人叫匿名分类)可以有多个

11.怎么将只读属性定义为readwrite?
子类定义读写属性


NSObject * __weak someObject = [[NSObject alloc] init];
, 这个someObject没有对象强引用他, 所以这行代码之后会立马被置为nil, NSObject * __weak someObject = self.someObject
, 这个someObject在这行代码之后不会立刻被置为nil, 而是会在所在的代码块结束后被置为nil


13.Xcode奇葩问题

"Couldn’t communicate with a helper application.
解决方案:
xcrun git config --global user.email your@email.com
xcrun git config --global user.name "your name"
在终端运行这两句,第二句不用加引号也行


14.设置navigationbar title颜色

 UIColor *whiteColor = [UIColor whiteColor];
NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName];
[self.navigationController.navigationBar setTitleTextAttributes:dic];

15.获取UIColor RGB

 UIColor *color = [UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSLog(@"Red: %f", components[0]);
NSLog(@"Green: %f", components[1]);
NSLog(@"Blue: %f", components[2]);
NSLog(@"Alpha: %f", components[3]);

16.修改textField的placeholder的字体颜色、大小

 [self.textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];

17.将color转为UIImage

 - (UIImage *)createImageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return theImage;
}

18.加载启动图的时候隐藏statusbar
在info.plist中加入Status bar is initially hidden 设置为YES


19.设置Status bar颜色

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, -20, ScreenWidth, 20)];[view setBackgroundColor:COLOR_APP_MAIN];
[viewController.navigationController.navigationBar addSubview:view];

20.json转dictionary,dictionary转json

+ (NSString*)dictionaryToJson:(NSDictionary *)dic {
    
    NSError *parseError = nil;
    
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];
    
    return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    
}
+(NSDictionary *)jsonToDic:(NSString*)jsonStr {
        NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
        NSError *err;
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                            options:NSJSONReadingMutableContainers
                                                              error:&err];
        return dic;
}

21.是否允许推送

+(BOOL)isAllowedNotification{
    
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        
        UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
        
        if(UIUserNotificationTypeNone != setting.types) {
                
            return YES;
        }
    }
    NSLog(@"不允许推送");
    return NO;
}

22.磁盘空间相关

+ (NSString *)memoryFormatter:(long long)diskSpace {
    NSString *formatted;
    double bytes = 1.0 * diskSpace;
    double megabytes = bytes / MB;
    double gigabytes = bytes / GB;
    if (gigabytes >= 1.0)
        formatted = [NSString stringWithFormat:@"%.2f GB", gigabytes];
    else if (megabytes >= 1.0)
        formatted = [NSString stringWithFormat:@"%.2f MB", megabytes];
    else
        formatted = [NSString stringWithFormat:@"%.2f bytes", bytes];
    NSLog(@"fotmatted=%@",formatted);
    
    return formatted;
}

+ (NSString *)totalDiskSpace {
    
    long long space = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil] objectForKey:NSFileSystemSize] longLongValue];
    return [self memoryFormatter:space];
}

+ (NSString *)freeDiskSpace {
    
    long long freeSpace = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil] objectForKey:NSFileSystemFreeSize] longLongValue];
    return [self memoryFormatter:freeSpace];
}

23.修改了leftBarButtonItem如何恢复系统侧滑返回功能

  //设置代理
self.interactivePopGestureRecognizer.delegate = self;
#pragma mark - <UIGestureRecognizerDelegate>
//实现代理方法:return YES :手势有效, NO :手势无效
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    //当导航控制器的子控制器个数 大于1 手势才有效
    return self.childViewControllers.count > 1;
}

或者用第三方 UINavigationController+FDFullscreenPopGesture
github 地址


24.使用UIAppearance在某个状态下设置颜色,字体等不好使

只需要在对应的位置用layoutIfNeeded刷新一下就可以了


25.如果在xib中有一个控件, 已经明确设置尺寸了,输出的frame也是对的, 但是显示出来的效果不一样(比如尺寸变大了), 如果是这种情况一般就是autoresizingMask自动伸缩属性在搞鬼!

解决办法如下:
//xib的awakeFromNib方法中设置UIViewAutoresizingNone进行清空

  - (void)awakeFromNib {
    self.autoresizingMask = UIViewAutoresizingNone;
}

或者在xib中不适用autolayout


26.通过图片Data数据第一个字节 来获取图片扩展名

- (NSString *)contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];
    switch (c) {
        case 0xFF:
            return @"jpeg";
        case 0x89:
            return @"png";     
        case 0x47:
            return @"gif";        
        case 0x49:   
        case 0x4D:
            return @"tiff";        
        case 0x52:  
            if ([data length] < 12) {
                return nil;
            }
            NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
            if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                return @"webp";
            }
            return nil;
    }
    return nil;
}

希望会给大家带来帮助 O(∩_∩)O

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,347评论 2 4
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,123评论 29 470
  • OC的理解与特性OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(...
    LIANMING_LI阅读 511评论 0 0
  • 来自网络 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会...
    用心在飞阅读 823评论 5 4
  • 艾薇儿说:“我纹身、抽烟、喝酒、说脏话,但我知道我是好姑娘。真正的贱人喜欢装无辜、装清纯、喜欢害羞、喜欢穿粉色衣服...
    十二杂苏桐阅读 387评论 0 3