oc基础复习05-OC的属性 和 点语法(转)

这篇文章大部分都是转载网络上的 里面有部分我更改的内容

一、设置器setter 访问器getter

setter:

set+首字母大写的实例变量名

如:- (void)setNickName:(NSString *) name;//参数名不要与实例变量名相同

getter:

与实例变量名相同(没有短横线),并且返回值类型也一致

例:

@interface Cup:NSObject

{

float _price;

}

- (void)setPrice:(float)price;

- (float)price;

@end

二、属性和实例变量的区别

1.   oc中实例变量的访问方式

oc中成员变量有三种访问权限,@public,@protected,@private。默认是@protected,再C++中默认是private。

@public 直接使用‘->’

@private @protected都需要分别给出设置方法和访问方法

建议实例变量都加下划线,与系统命名方式一致

2.property 属性是一组设置器和访问器,需要声明和实现

@property float price;

@synthesize price = _price;

(方法调试出错要会看 [receiver message])

3.属性的属性

属性也可以设置属性(attribute):读写(readonly,默认是readwrite)属性,原子性属性,setter语义属性

(1)readonly 只读

(2)给setter和getter方法起别名(setter = a:, getter = b)

atomic  开启多线程变量保护,会消耗一定的资源(非原子性,保证多线程安全)

nonatomic:禁止多线程变量保护,提高性能

(3)setter语义属性:

assign:直接赋值,适用于基本数据类型(非对象类型)

retain:赋值时做内存优化,使用于对象类型

copy:复制一个副本,适用于特殊的对象类型(有NSCoping协议的才可以用copy)

assign retain copy的setter方法的内部实现(笔试题)

assign:

@property float price;

内部实现:

- (void)setPrice:(float)price

{

_price = price;

}

getter是:

- (float)price

{

return _price;

}

retain:

@property (retain, readwrite, nonatomic) NSString *company;

内部实现:

- (void)setCompany:(NSString *)company{

if(_company != company){

[_company release];

[company retain];

_company = company;

}

}

copy:

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

内部实现:

- (void) setCompany:(NSString *)company{

if(_company != company){

[_company release];

[company copy];

_company = company;

}

}

三、使用属性和点语法

点语法(和[receriver message]是等价的)

注意OC里面的点语法是和其它语言里面的点语法是不一样的 它内部机制通过转化调用的是 set 和 get方法,因此在使用的时候必须要有set和get方法方可以进行使用。

1.性能有点差,内部转化为setter,getter

2.不易理解苹果的调用机制

3.属性

只要有setter(或getter)就可以使用点语法

时间: 2024-10-06 23:25:48

oc基础复习05-OC的属性 和 点语法(转)的相关文章

oc基础复习01-第一个OC程序

近期简单复习下OC打开iTerm工具 输入命令 mkdir reviewoc 打开Sublime Text文件 open -a Sublime\ Text 写入如下代码: 1 #include <stdio.h> 2 //main所有程序的入口 哈哈 这里就不说了 3 int main() 4 { 5 printf("Hello OC \n"); 6 } 保存为review01.m 编译文件 在reviewoc目录 cc -c review01.m 文件没有错误 直接会产生

OC基础复习(六)之构造方法小结

写到这里心慌慌的,压力骤然而起, 1.什么是构造方法? OC构造方法 构造方法我们创建一个对象的时候一般喜欢直接调用一个类方法,比如有一个Person类,我们为这个Person类创建对象一般是直接这样[Person new];其实new是NSObject中的一个类方法,这个new方法中是先调用了alloc方法,alloc方法也是一个类方法,作用是创建这个类的对象,再将这个对象的指针返回:再调用创建的对象的对象方法init,作用是初始化创建的对象的属性,然后返回这个已经被初始化的对象.比如: Pe

OC基础复习(三)之类方法和对象方法的理解

面向对象的难易点:其实也就是封装:要会调封装,也要会自己封装,封装就是给出一些接口,让我们去用,我们不关心其实现,但往往学的时候不踏实 说他容易是用着容易,只要有接口,就可以完成很多我们想要的功能,但往往分不清功能是自己能实现还是通过别人写好的框架或者方法来帮我实现 所以需要记忆一些常用方法和框架.把自己的算法思想和一些接口框架相结合. OC 有两种类型的方法,类方法和对象方法(也被称为实例方法) 1.类方法:以+开头,不分配内存空间(这句话,问题来了,为什么?) 什么时候分配内存空间,很显然只

2014.12.11 oc基础复习

这一天主要学习了内存管理的部分,感觉稍显复杂,但只要遵循总的原则就不会错 谁声明,谁销毁,谁retain,谁release 1.在类的成员变量是oc对象时,set方法需要写内存管理如 -(void)setBook:(Book *)book{ if( _book != book){ [_book release]; _book = [book retain]; } } 还要在调用这个set方法的类的dealloc方法中,加入[_book release] 在声明该对象成员变量的属性时,加入reta

oc基础复习03-OC的类

首先要想想面向对象和面向过程 在编程语言中 C是面向过程的 OC是面向对象的(一定要有一切即对象的思想)java也是对象对象的 js lua php是解释性语言(脚本) 不过现在好多都是模拟面向对象思想 也很不错. 在OC语言中 1.类的声明 @inteferface 类名:父类 { //这里声明类的属性 } //函数的声明 @end 2.类的实现 @implementation 类名 //函数的实现 @end 现在我们来些一个实例  写一个动物类 Animal 属性weight, sex;方法

2014.12.10 OC基础复习

oc是一种没有垃圾回收机制的语言,再没有打开arc的情况下,需要手动管理内存 @为关键字的开头,也是字符串的开头 @interface --@end 写对类的声明,包括对成员变量和方法的声明,@implementaion --@end之间写对类的方法实现,方法形如- (void)setAge:int; +号表示静态方法,-号表示动态方法 对象的声明初始化都是Student *st = [[Student alloc]init]; st指针就表示该对象 st.age不是访问成员变量,而是根据情况调

OC基础复习(二)之对象的存储细节

1.内存分为5大区:栈区,堆区,Bss段,数据区,代码区(排序方式:由高地址-->低地址) 其中注意:栈区对象的地址分配是先分配高地址,再分配低地址,(通俗讲就是在栈区中存的变量,先从地址高的开始往下存) 堆区是从低地址开始分配,再分配到高地址  如下图; 栈区:存储局部变量 堆区:存储程序运行的过程中动态分配的内存空间(通俗的理解就是实例对象,例如:Person *p = [Person new],这块内存空间就是指针变量p指向的这个空间) Bss段:存储未初始化的全局变量和静态变量 数据区:

oc基础复习10-OC的id

id类型 数据类型: 1.可以用来定义变量 2.可以用来当作参数 3.可以用来当作返回值 id类型是一个万能指针(可以保持任何对象的地址) id相当于 NSObject * id的本质 typedef struct objc_object *id; id是一个动态类型,在运行时才确定id的真实类型 id类型还可以调用私有方法 id和NSObject *的区别:id调用子类特有的方法不用强制类型转换 注意:id后面不能加*  id a = [Animal new];这个是正确的

OC基础复习02-BOOL

首先看下objc.h里面的定义 1 /// Type to represent a boolean value. 2 #if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__ 3 typedef bool BOOL; 4 #else 5 typedef signed char BOOL; 6 // BOOL is explicitly signed so @encode(BOOL) == "c"