iOS进阶+实战iOS超棒文集

iOS开发几年了,你清楚OC中的这些东西么!!!?

2016-08-17  本文已影响9366人  ZeroJ
前言

几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS的开发了, 之后就是对swift持续不断的学习, 近来swift3.0的发布, 更多的人会选择swift来进行iOS的开发看上去更是成为了一种趋势, 不过一个合格的iOS开发者对oc以及c语言的掌握是必不可少的技能, 本篇中主要是写一些大家平时都可能用到但是不一定知道的oc的东西

  1. oc中的对象的创建: 首先会通过 +(id)alloc 动态的分配所有的变量以及父类定义的变量所需要的足够内存, 同时会清除所有的分配的内存空间, 全部置为0
    NSString *string = @"string"; == [[NSString alloc] initWithString:@"string"];等初始化方法
    NSNumber *myBOOL = @YES; == [[NSNumber alloc] initWithBool:YES];
    NSNumber *myFloat = @3.14f; ==
    NSNumber *myInt = @42; ==
    NSNumber *myLong = @42L; ==...
  • 例如当有这样一个name属性的时候, 默认是readWrite的, 编译器会自动生成一个set (setName:)和get(-(NSString *)name)方法, 这个时候可以通过set或者get方法访问到name, 如果申明为(readonly), 那么将只会生成get方法
    [self setName:@"set name"];
    NSString *getName = [self name];
也可以通过点语法访问(实际上是会自动调用set和get方法)
    self.name = @"set name";
    NSString *dotName = self.name;
  • 同时你可以重写name的get(懒加载...)和setter(拦截set方法)...
    对应name属性, 编译器会生成(synthesize)一个 _name 允许我们直接通过指针访问变量, 而不会调用get方法, 所以通过_xx访问的变量不会调用懒加载(get方法), 所以在写懒加载方法的时候, 不能使用self.xx(造成死循环), 而要使用_xx
    - (NSString *)name {
 // 这里面不能使用self.name , 因为点语法会调用这个get方法, 造成死循环
    if (_name == nil) {
        _name = @"name";
    }
    return _name;
}
  • 同时这个synthesize的名字我们是可以自己修改的, 使用如下的语法
    @synthesize name = customName;
  • 那么这个时候就不能通过 __name访问到name了, 因为我们已经指定了通过customName才能访问到了
    NSString *getName = customName;
  • 当然如果, 你是这样写的 @synthesize name;, 并没有指定名字, 这个时候访问的时候就直接使用变量名而不需要加下划线( _ )了 name = @"set name"; 😄这个时候就比较爽了, 和swift,java这些一样, 不需要self,this了;
    @property (nonatomic) NSString *name;
    NSMutableString *str = [NSMutableString stringWithString:@"初始"];
    ViewController *ob = [ViewController new];
    ob.name = str;  ---- 浅拷贝
    NSLog(@"%@", ob.name); --- 初始
    [str appendString:@"+1"];
    NSLog(@"%@", ob.name); --- 初始+1
    这里出现ob.name改变的原因就是: 属性name是strong(默认)类型的,ob.name = str; 这行代码赋值后, 实际上只是name强指向了str, 所以当str的内容改变的时候, ob.name也改变了
    NSLog(@"%@", ob.name); --- 初始
    str = [NSMutableString stringWithString:@"改变"];
    NSLog(@"%@", ob.name); --- 初始
    但是这样的赋值, 直接改变str之后并不会影响原来的str的指针指向的内容, 所以ob.name仍然指向原来的str, 因此内容并未改变
    如果将上面的  ob.name = str; 改为 ob.name = [str mutableCopy]; 那么将上面的两种操作都不会影响ob.name ---- 深拷贝
    如果name被修饰为copy
    @property (nonatomic, copy) NSString *name;
    那么上面的操作都不会改变ob.name的内容 ---- 深拷贝
  ///例如可能是这样的使用
    static const void *propertyKey = &propertyKey;
    /// 将value通过运行时绑定到self
    objc_setAssociatedObject(self, propertyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    /// 将value在运行时中通过propertyKey取出绑定的值
    id value = objc_getAssociatedObject(self, propertyKey);
      @implementation ViewController(tableview)
      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
}
...
@end
     int anInteger = 42;
 
    void (^testBlock)(void) = ^{
        NSLog(@"Integer is: %i", anInteger);
    };
 
    anInteger = 84;
 
    testBlock(); ---- 输出的值仍然为 42
    __block int anInteger = 42;
 
    void (^testBlock)(void) = ^{
        NSLog(@"Integer is: %i", anInteger);
    };
 
    anInteger = 84;
 
    testBlock(); --- 输出值这时是 84

按照惯例, 我的文章里面都会有demo的, 但是这篇文章没有demo, 因为这只是写一点点语法的东西

上一篇下一篇

猜你喜欢

热点阅读