iOS开发经验(1)

2016-08-31  本文已影响149人  Ryan___
目录:
  1. 在字符串查看指定字符串
  2. UILabel自适应
  3. 服务器数据处理
  4. copy解释
  5. 对象及可变字典赋值取值方法
  6. nil NSNULL NULL解释
  7. 字面量
  8. UILabel 黑线问题
  9. nullable和nonnull
1. 在Objective-C中怎么检查一个字符串中是否还有另外一个字符串.
- (BOOL)containsString:(NSString *)str     NS_AVAILABLE(10_10, 8_0);

之前:

NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) 
{
     NSLog(@"string does not contain bla");
} else { 
    NSLog(@"string contains bla!");
}
2. UILabel自适应
CGSize size = [s.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10]}];
NSDictionary *attribute = @{NSFontAttributeName: font};
height = [text boundingRectWithSize:CGSizeMake(width, 0) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine attributes:attribute context:nil].size.height;
CGSizeMake(width -16.0, CGFLOAT_MAX)
return sizeToFit.height + 16.0。

UILable中则不用.

CGSize sizeToFit = [textView sizeThatFits:CGSizeMake(width, MAXFLOAT)];
3.后台数据处理
NSDictionary *responsObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments   error:nil];
4. 三种方式 copy, mutableCopy, =
5. setvalue 与set object 字面量
Amodel *modelA = [[Amodel alloc]init];
    SubAmodel *modela = [[SubAmodel alloc]init];
    modela.str = @"qq.com";
    modelA.submodel = modela;
    NSLog(@"%@",modelA.submodel.str);
    [modelA setValue:@"QQ.com" forKeyPath:@"submodel.str"];
    NSLog(@"%@",modelA.submodel.str);
6. NSNull NULL nil
        NSArray *arr1 = [NSNull null];
        NSArray * arr2 = nil;
        NSLog(@"%@", arr1);  <null>
        NSLog(@"%@", arr2);  (null)
        NSLog(@"%p", arr1);   0x10cf4bd80
        NSLog(@"%p", arr2);   0x0
    if ([arr1 isKindOfClass:[NSArray class]]) {
    }
    if (arr1 == NULL) {
    }
    if (arr1 == nil) {
    }
    if ([arr1 isKindOfClass:[NSNull class]]) {
    //arr1 只走这个+1
    }
        if ([arr2 isKindOfClass:[NSArray class]]) {
        }
        
        if (arr2 == NULL) {
        //arr2 走这个+1

        }
        if (arr2 == nil) {
        //arr2 走这个+2
        }
        if ([arr2 isKindOfClass:[NSNull class]]) {
        }
        [arr1 count]; //会crash。
        [arr2 count];//不会crash。
 - (id) setNoNull:(id)aValue{
    if (aValue == nil) {
        aValue = @"";//为null时,直接赋空
    } else if ((NSNull *)aValue == [NSNull null]) {
        aValue = @"";
        if ([aValue isEqual:nil]) {
            aValue = @"";
        }
    }
    return aValue;
}

既然它老出bug ,为什么还在oc里还有它的存在
NSNullnil以及NULL不同,因为它是一个实际的对象,而不是一个零值。
nil null 其实就是0
NSNullFoundation和其它框架中被广泛的使用,以解决如NSArrayNSDictionary之类的集合不能有nil值的缺陷。
你可以将NSNull理解为有效的将NULL或者nil值封装boxing,以达到在集合中使用它们的目的:

NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
mutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for `someKey`
NSLog(@"Keys: %@", [mutableDictionary allKeys]); // @[@"someKey"]
7. 字面量
NSArray *array = [NSArray arrayWithObjects:@"obj1", @"obj2", nil];

而使用字面量语法则是:

NSArray *array = @[@"obj1", @"obj2"];

数组的取下标也有字面量语法:
NSString *obj = [array objectAtIndex:1];
使用字面量:
NSString *obj = array[1];
不过使用字面量数组时,要注意不要把nil加入到数组中,否则会抛出异常。

NSMutableArray *mutableArray = [@[@1, @2, @3, @4, @5]mutableCopy];
mutableArray[3] = @33;
NSMutableDictionary* mutableDic = [@{@"name":@"song",
                                 @"age":@"28",
                                  @"tel":@"1234567"}mutableCopy];
mutableDic[@"age"]=@"30";
  1. Foundation框架 是在iOS开发中 用到的最频繁的基础框架,它提供了几个最基本的类:NSStringNSNumberNSArrayNSDictionary. 在这个框架下,尽量使用对象字面量语法创建字符串, 数字, 数组和字典等.其他自定义的对象不可使用字面量。
  2. 在数组和字典中, 要使用关键字和索引做下标来获取数据
  3. 使用对象字面量语法时, 容器类里不可是nil, 否则运行时贵抛出异常.
8. UILabel 黑线问题

偶尔发现UILabel右边缘出现黑线,iPhone6P、6sP最为明显:
使用循环计算label尺寸, 循环创建label时有可能出现右边缘黑线的问题, 且有时在iPhone5s一下机型不会出现, 只在iPhone6以上出现 ,这是因为计算出得size可能的值会是30.31123323…… 这样的数。
猜想: 而像素值显示的时候不可能出现显示半个像素的情况, 那么不足一个像素的值就会被忽略掉, 在分辨率较低的机型上不会出现, 而分辨率较高的则不会忽略, 就出现了黑线。
解决方法
计算出来的UILabel尺寸,向上取整

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping ;
[paragraphStyle setLineSpacing:4];
NSDictionary *attributes = @{NSFontAttributeName:kDesFont, NSParagraphStyleAttributeName:paragraphStyle.copy};
CGSize size = [text boundingRectWithSize:CGSizeMake(cellWidth, 0) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil ].size ;
size.width = ceil(size.width);
size.height = ceil(height);
9. nullable和nonnull

Xcode 6.3新特性:Nullability Annotations,这一新特性的核心是两个新的类型注释:nullable和nonnull。从字面上我们可以猜到,nullable表示对象可以是NULL或nil,而nonnull表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。
事实上,在任何可以使用const关键字的地方都可以使用nullable和nonnull,不过这两个关键字仅限于使用在指针类型上。而在方法的声明中,我们还可以使用不带下划线的nullable和nonnull,如下所示:

- (nullable id)itemWithName:(NSString * nonnull)name

在属性声明中,也增加了两个相应的特性,因此上例中的items属性可以如下声明:

@property (nonatomic, copy, nonnull) NSArray * items;

也可以用以下这种方式:

@property (nonatomic, copy) NSArray * __nonnull items;

如果需要每个属性或每个方法都去指定nonnull和nullable,是一件非常繁琐的事。苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN,NS_ASSUME_NONNULL_END。在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。

NS_ASSUME_NONNULL_BEGIN

@interface TestNullabilityClass ()
@property (nonatomic, copy) NSArray * items;
- (id)itemWithName:(nullable NSString *)name;
@end

NS_ASSUME_NONNULL_END
上一篇 下一篇

猜你喜欢

热点阅读