IOS学习笔记01-关于objective-c的成员属性

原创 2015年07月11日 10:12:06

  在我接触过的所有编程语言中,obj-c的语法无疑是最独特的,(其次可能就是Python了吧,因为没有花括号偷笑),尤其是其中的@property,@synthesize。今天就对在这过程中遇到的几个让我迷惑过的关键字进行总结:

1,@property

@property关键字是在声明成员属性时使用的一个关键字,使用方式通常为@property(属性1,属性2,属性3)成员类型 成员名,三个属性字段的含义分别为赋值方式、读写权限、和原子性(可不完全指定,也可不按顺序指定),比如在某个类中看到这样一段声明:

@property(copy,readwrite,nonatomic)NSString *value1;

意思就是这个类里有一个NSString*型的成员变量value1,当对其赋值时采用copy的方式(copy),对外界可读可写(readwrite),对其操作是非原子性的(nonatomic在你通过@property关键字为成员指定了一些合法属性之后编译器能够自动的根据你指定的属性为你做很多事(比如生成get,set方法,进行内存管理等)。

1.1 赋值方式

赋值方式取值有三个assign,retaincopy,在不显式指定时系统默认的方式是assign;

1.1.1 assign

   assign可以简单的理解成为浅拷贝,比如下面这段代码:
@interface MyClass : NSObject

@property(assign,readwrite,nonatomic) NSMutableString *value1;

@end

@implementation MyClass

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableString *str= [[NSMutableString alloc] initWithString:@"Hello "];
        MyClass *myClass = [[MyClass alloc] init];
        
        myClass.value1 = str;
        [myClass.value1 appendString:@"world!"];
        
        NSLog(@"%@",str);
    }
    return 0;
}
这段代码会输出什么呢?str的值为“Hello ”啊,那就输出“Hello ”呗。这样想就错了,因为我们在声明中有这样一句
@property(assign,readwrite,nonatomic) NSMutableString *value1;
所以在执行
myClass.value1 = str;
时只是简单的将str的地址赋值给了myClass.value1,这就是我们之前说的浅拷贝,所以接下来对myClass.value的操作自然会影响到str。简而言之就是assign就是简单的按位拷贝,除此之外什么都不做。因此上面的代码应该输出“Hello world!”
那么这样到头来就导致了一个问题,在这个例子里如果我们在外界释放了str指向的内存,那么myClass.value1就指向了一个被释放了得空间。我们如果在这种情况下使用myClass.value1就会导致意想不到的结果。所以这儿就引入了一个约定成俗的说法,一般我们只对基础数据类型(比如NSIteger,int,float等)采用assign的方式赋值,对于NSObject及其子类由于引用计数的存在,如果只是单纯的按位拷贝(对于指针而言就是简单的赋给地址),当其指向的对象引用计时器清零之后,并不会及时的将指针赋值为nil,此时向一个已经被释放的对象发送信号,就会导致错误。所以我们就引入了ratain得赋值方式。

1.1.2 ratain

我们将上面代码中的assign改变为ratain运行看看会是什么结果,其实还是输出Hello world!。ratain其实也是直接赋给地址,但是在赋值的时候会将指针所指对象的引用计数器加一。因此采用这种方式及时在外部str出了生命周期,他也只是将其指向的对象的引用计数器减了一。此时由于其引用计数任然为一,所以不会呗销毁,在内部任然可以使用myClass.value1。因此通常而言对于类型为NSObject或其子类的成员我们一般都用retain(NSString除外)。

1.1.3 copy

copy是三种方式中唯一一种生成新地址的拷贝方式,使用copy方式的成员需要实现NSCoping协议(比如NSString)。在拷贝的过程中就会去调用等号右边对象的copy方法,生成新对象,然后将新对象的地址赋给等号左边,并将其引用计数器置为1。通常而言我们拷贝NSString时使用copy方式。

1.2 读写权限

读写权限分为两类,readonly和readwrite,如果不写的话默认为readwrite。即编译器会为其生成get和set函数,如果是readonly的话则只会为其生成get函数。在这里顺便提一下oc里面的"."操作符会自动的去调用get和set函数(如果存在的话)。

1.3 原子性

原子性只有两个取值nonatomicatomic表示对其操作是原子性和非原子性的。所谓原子性就可以粗暴的理解为当前线程在对其进行操作的时候不允许其他线程对其进行操作,避免出现数据异常,用来在一定程度上保证并发结果的正确性,然而要保证并发的正确性还需要用到一些同步机制,所以单靠atomic是远远不够的,而且atomic影响程序的执行效率,所以我基本都是用nonatomic。

后记

在写这篇笔记之前参考了很多写得很棒的博文,在此对各位作者表示真心的感谢,如果您在文章里发现有长得特别想您文章的片段或句子的话请留言告知。另外本人才接触ios不久,文章难免有疏漏,错误之处,还望各位斧正!

Objective-C 类,数据成员,函数成员,对象,

一、类 在ios中,类的声明和实现时分离的,也就是说不能写在同一个文件中,声明放在 .h文件中,实现放在 .m 文件中。在实现文件中引入 .h文件,#import "xxx.h" 声明一个类...
  • imxiangzi
  • imxiangzi
  • 2017年02月27日 22:45
  • 349

【iOS沉思录】深思Objective-C中的property属性

OC中的属性 属性(Property)是Objective-C语言的其中一个特性,它把类对象中的数据变量及其读写方法统一封装起来,是对传统C++中反复定义变量读写方法的一种封装优化,OC将这些变量封装...
  • cordova
  • cordova
  • 2016年11月22日 19:21
  • 1665

Objective-C学习笔记和IOS入门

1. main(int argc, char * argv[]){} (因为程序名总是用作启动参数传递,所以argc的值至少是1) 2. NSLog(@"some strings"); @"" ...
  • wen942467928
  • wen942467928
  • 2016年05月09日 14:14
  • 980

Objective-C Runtime 运行时(二):成员变量与属性

在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现。 本章的主要内容将聚集在Runtim...
  • u013794726
  • u013794726
  • 2015年09月07日 23:03
  • 975

解惑——iOS中成员变量和属性区别

一篇文章告诉你到底怎么区别iOS成员变量和属性的前世今生
  • u012946824
  • u012946824
  • 2016年06月30日 10:56
  • 6029

iOS开发应该选择Objective-C还是Swift

iOS开发应该选择Objective-C还是Swift,这里会给出你选择:1.如果你想成为一个iOS开发者,你仍然需要学习Objective-C。2.Objective-C比Swift更容易学习。3....
  • qq_31389903
  • qq_31389903
  • 2016年04月08日 08:18
  • 1722

iOS基础-属性与成员变量的区别

比较早期的ios我们为输出口同时声明了属性和底层实例变量 @interface MyViewController :UIViewController { UIButton *myButton;...
  • bruceyou1990
  • bruceyou1990
  • 2016年04月25日 05:09
  • 1016

[Objective-C] 哪些变量默认初始化为0

参考: http://stackoverflow.com/questions/1786781/are-instance-variables-set-to-nil-by-default-in-objec...
  • yasi_xi
  • yasi_xi
  • 2015年07月07日 09:25
  • 1813

IOS开发中 类、对象、实例变量、成员变量、属性变量等区别和关系

类(class):具有相同属性和行为等同一类元素等总称,类是一个抽象的概念。 区分是类还是对象,看它能否继续被细分。 在OC中,类是表示对象类型的结构体,对象通过类来获取自身的各种信息。类由两个部...
  • wangtianyong0
  • wangtianyong0
  • 2016年01月06日 22:08
  • 2078

Objective-C中属性的正确赋值和释放

最近一直比较忙,好久没有写日志了。今晚突来兴趣,写一下最近遇到的一个问题。         刚开始没有深入理解OC中对象的属性,没有理解声明@property和合成@synthesize的属性与普通的...
  • lqcjdx
  • lqcjdx
  • 2014年11月27日 15:37
  • 4076
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS学习笔记01-关于objective-c的成员属性
举报原因:
原因补充:

(最多只允许输入30个字)