美文网首页
OC基础知识

OC基础知识

作者: 走道牙的人 | 来源:发表于2016-07-09 22:36 被阅读1次

@property 修饰符
什么情况使用 weak 关键字,相比 assign 有什么不同?
怎么用 copy 关键字?
这个写法会出什么问题: @property (copy) NSMutableArray *array?

如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter?
@property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的
@protocol 和 category 中如何使用 @property
runtime 如何实现 weak 属性

1、读写性修饰符:readwrite | readonly
2、setter相关修饰符:assign | retain | copy
assign:表示直接赋值,用于基本数据类型(NSInteger和CGFloat)和C数据类型(如int, float, double, char等)另外还有id类型,这个修饰符不会牵涉到内存管理。但是如果是对象类型,使用此修饰符则可能会导致内存泄漏或EXC_BAD_ACCESS错误;
retain:针对对象类型进行内存管理。如果对基本数据类型使用,则Xcode会直接报错。当给对象类型使用此修饰符时,setter方法会先将旧的对象属性release掉,再对新的对象进行一次赋值并进行一次retain操作;
copy:主要用在NSString类型,表示复制内容;
系统默认属性是assign。retain是指针的复制不重新分配内存空间,copy是内容的复制;
.原子性修饰符:atomic | nonatomic

atomic:表示是线程安全的。
nonatomic:表示是非线程安全的,使用此属性性能会提高一些。
系统默认是atomic
4、getter和setter修饰符@property(getter = getMethodName, setter = setMethodName) Object *obj;
这两个属性修饰符用于设置自定义生成的getter和setter方法名,使用之后将不再使用系统默认的setter和getter方法名;

在@property修饰符中可以出现多个修饰符,分别用逗号分隔,但是,在上述修饰符中,1,2,3组中的属性分别之恩那个出现一个,只有4中可以同时出现。

Xcode4.2(iOS sdk4.3和以下版本)和以前的版本用retain和assign
Xcode4.3(iOS 5和以上版本)或之后有了ARC用strong和weak
assign:用于非指针变量。用于基础数据类型(如NSInteger, CGFloat)和C数据类型(int, float, double, char等), 另外还有id类型。
记住:前面不需要加*的就用assign
retain:用于指针变量。一般用于字符串(NSString, NSMutableString), 数组(NSMutableArray, NSArray),字典对象,视图对象(UIView),控制器对象(UIViewController)等
strong类似于retain,weak类似于assign
最简单的记忆:
使用assign:对基础数据类型(如NSInteger, CGFloat)和C数据类型(int, float, double, char等), 另外还有id类型
使用copy:对NSString类型
使用retain:对其它NSObject和其子类

1、在头文件中用@property声明一个属性名,编译器会自动为我们转换成这个属性名的getter方法和setter方法。

2、在实现文件中使用@synthesize propertyName,编译器先会查找这个属性名的setter方法和getter方法有没有被人为实现,如果已经实现,则不再实现,如果没有,则会帮我们生成一个属性命的setter方法和getter方法。

3、当在实现文件中使用了@synthesize propertyName,编译器还会做一件事情,在类成员变量中查找一个名为_propertyName的成员变量,如果没有,再继续查找名为propertyName的成员变量,如果这两个都没有,编译器会自动为我们生成一个私有的名为_propertyName的成员变量。注意,系统自动创建的都是私有的。

4、当在实现文件中这样写@synthesize propertyName = varName;时,setter和getter方法所对应的是一个名为varName的成员变量,修改和读取的是varName成员变量的值。

5、当我们在实现文件中不写@synthesize propertyName时,在Xcode 4.5之前的版本不会帮我们自动实现setter和getter方法,系统当然也不再会为我们生成对应的成员变量。但是在Xcode 4.5之后可以不用写@synthesize了,就跟3、4一样了。

6、当我们既定义了@synthesize,又在实现文件中人为重写setter和getter方法时,那么@synthesize将不再工作,也就不会为我们创建没有定义的_propertyName成员变量了,这时候如果在setter和getter方法中调用_propertyName将会发生编译错误

相关文章

  • react-native 基础知识链接

    OC基础知识-https://www.cnblogs.com/twcblog/p/4443189.html OC-...

  • 编写高质量iOS与OS X代码的52个有效方法(一)

    这本书没有OC语言的基础知识,讲的是如何高效运用这门语言 第一章 熟悉OC 1、什么是OC ·OC是为C语言添加了...

  • oc基础知识回顾

    oc基础知识回顾 1.import的作用 2.OC中的数据类型 3.NSArray和NSMutableArray不...

  • 小马哥视频笔记-OC基础知识

    复习一遍OC基础知识,做一个完整笔记[toc] OC初步认知 OC是兼容C语言的OO:面向对象OOP:面向对象编程...

  • Objective-C(简称OC)

    OC基础知识: OC继承了C语言的所有特点。 @ 表示C语言没有 OC所增加的 每次拿内存之后,要查看是否申请到内...

  • OC语言大集合

    下面是我最近两年学习OC中的一些基础知识,对于学习OC基础知识的人可能有些帮助,拿出来分享一下,还是那句话不喜勿喷...

  • 托XX福写个Swift闭包教程

    闭包基础知识 Swift闭包和OC的block类似不过还是有点区别 OC的block是一个匿名函数 Swift 中...

  • OC基础知识

    @property 修饰符什么情况使用 weak 关键字,相比 assign 有什么不同?怎么用 copy 关键字...

  • OC基础知识

    OC中内存分为五大区域 栈:存储局部变量和指针堆:创建对象BSS:存储未初始化的全局变量和静态变量数据段(常量区)...

  • OC-基础总结(二)

    OC基础总结 重新回过头看这些基础知识,对许多知识点都有新的认识,拥有坚实的基础才能更快的成长。 OC内存管理 -...

网友评论

      本文标题:OC基础知识

      本文链接:https://www.haomeiwen.com/subject/ndqdjttx.html