【OC学习-9】利用@property属性和@synthesize简化实例变量的存取器方法

如果我们在一个类中定义了3个实例变量,那么如果要写存取器方法的话,需要写6个(每个实例变量各一个setter和getter)。现在的简化方法是:

(1)在类的.h文件里,只要写了属性,那么这个实例变量就可以被操作,如果想要不被操作保证安全,那么就不要声明属性,只要写在实例变量里即可。

#import <Foundation/Foundation.h>
//我们一般会省略实例变量的写法,因为写了属性后,一般会自动生成同名的实例变量
@interface ASStudent : NSObject{
    NSString *name;
    NSString *sid;
    int age;
}
//只要定义了属性,就可以用点方法使用如zhang.name或者zhang.setAge等
@property(nonatomic,assign) NSString * name;
@property(nonatomic,assign) NSString *sid;
@property(nonatomic,assign) unsigned int age;
@end

atomic(默认)和nonatomic:和线程有关,atomic固然好,相当于多线程访问时一个线程访问时锁定,等释放了下一个线程才能访问,避免数据不一致冲突这些,但是耗费资源;nonatomic在没有多线程只有单线程的时候最合适。

assign和retain:这个和内存分配和回收有关,如果是assign分配给A,A再赋值给B,此时A或者B要释放内存是不可以的,因为你不知道另一方在不在用。retain分配或者赋值一次就计数+1,释放一次就计数-1,所以好。assign适合int,float这些原生类型变量。retain适合NSString这些对象指针之类的。

readonly和readwrite(默认):readonly就是只生成getter方法;readwrite是getter和setter都生成。

(2)在类的.m文件里

//是的,就一行,代替之前的六个方法(函数)
@synthesize name,age,sid;

在main.m函数里照样使用zhang.name,zhang.setAge这些方法,因为默认生成。

我们一般的做法:

a)如果有需要保护的实例变量,那么就不要声明属性,直接在实例变量里面写即可

b)其他没有特殊要求的实例变量一般不写,而是直接写声明属性即可。

c)当然上一条属性直接生成的实例变量会和属性名同名,有危险,那么我们可以通过在类的.m文件里修改系统自动生成的实例变量的名字,如下:

#import "ASStudent.h"
@implementation ASStudent
//这样属性名是name,实例变量名是_name,默认是_,你可以改其他,但不建议
@synthesize name=_name,age=_age,sid=_sid;

-(id)initWithName:(NSString *)aName Sid:(NSString *)aSid Age:(int)aAge{
        if (self=[super init]) {
            //利用属性来赋值,可以直接点操作即可
            self.name=aName;
            //和上一条效果一样,但是赋值时的实例变量不是name,而是_name了
            _name=aName;
            _sid=aSid;
            _age=aAge;
        }
        return self;
    }
@end

最后:

我们看到利用@property和@synthesize会默认生成那6个方法,这个方法名就是:如果实例变量是name,那么getter方法名是name,setter方法名是setName。如果像修改这种默认的方法名,只需要在声明属性时进行修改即可,但不建议,具体如下:

@property(nonatomic,assign,getter = newName,setter = setNewName:) NSString * name;
时间: 2024-10-04 13:51:39

【OC学习-9】利用@property属性和@synthesize简化实例变量的存取器方法的相关文章

ios的@property属性和@synthesize属性(转)

当你定义了一系列的变量时,需要写很多的getter和setter方法,而且它们的形式都是差不多的,,所以Xcode提供了@property 和@synthesize属性,@property用在 .h 头文件中用作声明,@synthesize用在.m 文件中用于实现. 如下,新建一个基于"Command Line Tool"的项目,名为"property",再新建一个Student类, 传统的写法是: Student.h [cpp] view plaincopy //

【OC学习-8】存取器方法?getter和setter?事实上就是赋值和返回值的两种函数

我们在声明类的时候,有实例变量+方法(函数),这些实例变量假设默认的话都是protected类型,一般无法直接訪问.更别提赋值和调用了,所以就产生了两种函数,getter函数就是可以返回实例变量的值,setter函数就是可以设置实例变量的值.(当然假设你把实例变量改成public的话可以直接调用,但不安全) 存取器方法(函数)就是:存--赋值setter函数.取--返回值getter函数. (1)先在类的.h文件中面声明这个函数(方法).一般都有默认的格式(例如以下):返回值函数的函数名字一般都

【OC学习-8】存取器方法?getter和setter?其实就是赋值和返回值的两种函数

我们在声明类的时候,有实例变量+方法(函数),这些实例变量如果默认的话都是protected类型,一般无法直接访问,更别提赋值和调用了,所以就产生了两种函数,getter函数就是能够返回实例变量的值,setter函数就是能够设置实例变量的值.(当然如果你把实例变量改成public的话可以直接调用,但不安全) 存取器方法(函数)就是:存--赋值setter函数,取--返回值getter函数. (1)先在类的.h文件里面声明这个函数(方法),一般都有默认的格式(如下):返回值函数的函数名字一般都和变

bootstrap学习之利用CSS属性pointer-events禁用表单控件

参考链接: CSS3 pointer-events:none应用举例及扩展 首先pointer-events在除去SVG中的应用只有两个值:AUTO | NONE pointer-events:none 该属性可以让应用此属性的元素都会变成“真空”,比如:一个a连接上面覆盖一个div,当该div的css属性中有该属性时,该div就像不存在一样,可以直接点击到下方的a标签 这是一个很神奇的属性,Bootstrap就是利用这个属性,实现禁用控件的效果. Bootstrap中实现禁用效果有两个方法:

利用类别(Category)为对象添加”实例变量”

主要利用ObjectiveC的C API中函数: void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) id objc_getAssociatedObject(id object, const void *key) 原理详细参见官方的ObjectiveC Runtime Reference. 好了,现在直接写怎么做了. 1.在定义类别之前, 引入runt

Objective-C学习笔记_实例变量可?度及方法

? 实例变量可?度 可见度 特点 public(公有的) 实例变量可以在类的外部和内部操作 protected(受保护的,默认的) 实例变量只能在本类和其?类内部操作 private(私有的) 实例对象只能在本类内访问 所谓的内部,指的是相应类的@implementation和@end之间. 示例代码如下: #import <Foundation/Foundation.h> @interface Person : NSObject { @public NSString *_hobby; /**

OC学习篇之[email&#160;protected]和@synthesize的使用

在之前一片文章我们介绍了OC中的内存管理:http://blog.csdn.net/jiangwei0910410003/article/details/41924683,今天我们来介绍两个关键字的使用:@property和@synthesize 一.@property关键字 这个关键字是OC中能够快速的定义一个属性的方式,而且他可以设置一些值,就可以达到一定的效果,比如引用计数的问题 下面来看一下他的使用方法: // // Person.h // 25_Property // // Creat

(转)Objective-C语言--属性和实例变量

本文转自http://blog.csdn.net/addychen/article/details/39525681 使用Objective-C一段时间了,一直没有弄清楚在Objective-C中属性和实例变量,在这里总结一下,Objective-C中先有的实例变量,需要给外部类使用的用@public声明,内部自己使用的用@private或@protect声明.Objective-C添加了属性后,我觉得Apple的考虑应该是,属性用于对外而实力变量主要用于程序内部使用.这样有利于代码的分离,由于

OC基础之-Property(属性)和点语法

学习属性之前回忆一下之前学到的setter方法和getter方法: (1)setter方法的作用:用来为单一的实例变量赋值(只能是一个实例变量,多了的叫做get方法) (2)setter方法的写法标准: - 号方法,  无返回值,   名字以set开头+要设置的变量的实例变量名(首字母需大写):(setter方法有且只有一个参数)+参数的类型(和实例变量的类型相同)+参数名(和实例变量名相同) (3)getter方法的作用:用来获取单一实例变量的值. (4)getter方法的写法标准: - 号方