iOS疑难点

栏目: IOS · 发布时间: 6年前

内容简介:iOS疑难点总结,部分摘自参考链接在iOS中常见到如下写法:在上述写法中,

前言

iOS疑难点总结,部分摘自参考链接

正文

self.var还是_var?

在iOS中常见到如下写法:

@interface Demo ()

@property(nonatomic, strong) NSString *name;

@end

@implementation Demo

- (void)test {
    _name = @"";
//    self.name = @"";
}

@end

在上述写法中, self.name_name 有什么区别呢?

在解释其区别之前,需要先了解一下OC中的属性和实例变量,实例变量具有私有性,一般仅在类内部使用,为了方便给外界读写这个实例变量,就有了属性(@property)

在iOS第一版中,需要同时声明属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求必须声明与之对应的实例变量;如下:

// MyViewController.h
@interface MyViewController : UIViewController
{
    UIButton *myButton; // 实例变量
}
@property (nonatomic, retain) UIButton *myButton; // 属性
@end

之后,苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量(即 var 属性及与其对应的 _var 实例变量),如下:

// MyViewController.h
@interface MyViewController : UIViewController
@property (nonatomic, retain) UIButton *myButton; // 将自动创建一个_myButton实例变量与之对应
@end

在MyViewController.m中可以直接使用 _myButton 实例变量,也可以通过self.myButton来访问,二者的区别也是下面要讲解的;

再来看下面一个例子:

// MyViewController.h
@interface MyViewController : UIViewController
{
    NSString *name; // 实例变量
}
@end

在MyViewController.m文件中,如果通过self.name访问的话,编译器会报错,Xcode会提示使用->,即使用self->name,这是因为OC中点表达式表示调用方法,而这里的name是一个实例变量,没有与其对应的name方法

另外,还有一个与@property合用的@synthesize,通过@synthesize还可以指定与属性对应的实例变量名,如下:

// MyViewController.h
@interface MyViewController : UIViewController
@property (nonatomic, retain) UIButton * myButton;
@end

// MyViewController.m
@implementation MyViewController
@synthesize myButton = otherButton;
@end

此时,与属性myButton对应的实例变量名为otherButton了,默认的 _myButton 就不能使用了;还需要注意的一点是,如果只是声明了 @synthesize myButton; ,那么此时默认与myButton对应的实例变量名为myButton, _myButton 也不能用了

到这里我们应该知道了使用 self.var_var 的区别,即self.var实际上是调用了属性方法,即getter和setter方法,而 _var 是直接调用的实例变量,不会走getter和setter方法;因此,这里需要注意的是,当我们要重写getter方法时,在getter方法中必须使用 _var 实例变量,否则会造成getter方法的递归调用;同理,重写setter方法时,在setter方法中也只能使用 _var 实例变量,否则也会造成settter方法的递归调用;另外,直接访问实例变量的话,就不会调用其setter方法,这样就绕过了为相关属性所定义的内存管理语义。例如:在ARC下直接访问一个语义为copy的属性,那么并不会copy该属性,而仅仅是保留新值并释放旧值

参考链接:

  1. https://www.jianshu.com/p/48056965ddce
  2. http://www.cnblogs.com/crazypebble/archive/2013/11/23/3439261.html

@property与@synthesize

我们知道@property可用于在头文件中声明getter和settter方法,@synthesize方法可用于.m文件中实现getter和setter方法;但是实际情况是,如果我们只是在头文件中使用了@property,而没有在.m文件中使用@synthesize,编译器实际上还是会为我们生成getter和setter方法;这是因为从Xcode 4.4 开始,@synthesize属性是默认声明了的

参考链接:

  1. https://stackoverflow.com/questions/7496463/objective-c-property-declaration-without-implementation-synthesize

扩展(extension)与分类(category)

参考链接:

  1. https://www.jianshu.com/p/9e827a1708c6
  2. https://blog.csdn.net/hherima/article/details/44242469

宏定义中的do{}while(0)使用

参考链接:

  1. https://blog.csdn.net/luoweifu/article/details/38563161

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Transcending CSS

Transcending CSS

Andy Clarke、Molly E. Holzschlag / New Riders / November 15, 2006 / $49.99

As the Web evolves to incorporate new standards and the latest browsers offer new possibilities for creative design, the art of creating Web sites is also changing. Few Web designers are experienced p......一起来看看 《Transcending CSS》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具