美文网首页
Object-C属性,实例变量

Object-C属性,实例变量

作者: 轻云绿原 | 来源:发表于2017-04-23 11:15 被阅读7次
#import <Foundation/Foundation.h>

@interface Demo01 : NSObject{
    /**实例变量*/
    NSString *string_;
}

/**使用@property让编译器知道我们有一个属性,但是那还不够。
在执行文件中使用@synthesize,我们可以使编译器自动生成获取器(setter)和
 提取器(getter)
 */
@property(nonatomic,copy) NSString *string;

@end
属性特性 属性定义
只读/readonly 当你不希望属性被人修改时。你仍然可以修改字段支持的属性,且编译器不会生成一个安装器。
保留/retain 当你处理对象的值时。编译器将保留传递值,并当有新值来到的时候释放旧值。
读写 当你想要属性可以被人修改时。编译器将为你生成一个获取器和一个安装器。这是默认情况。
复制(copy) 当你想要保留一些值的复制而不是那个值本身时。例如,如果你想要保留一个数组,并且不希望人们在他们设置后还能够改变它的内容。只要发送一个复制的消息到传递值,然后保留它们。
指派(assign) 当你处理基本类型时。如ints,floats等等,编译器只创建一个安装器,并使用一个简单的语句myField=什么值。这是默认情况,但通常并不是你想要的。

下面是Objective-C为每个属性(Property)生成的声明,请你为它们编写代码。假设每个都通过名为_myField的字段被返回(以下是在MRC模式下,ARC会报错)。

@property(nonatomic,readonly) NSString *myField;

//代码
- (NSString *) getMyField{
    return _myField;
}
@property(nonatomic,retain) NSString *myField;

//代码
- (NSString *) getMyField{
    return _myField;
}

- (void) setMyField:(NSString *)myField{
    if (myField != _myField) {
        [_myField release];
        _myField = [myField retain];
    }
}
@property(nonatomic,assign) NSString *myField;

//代码
- (NSString *) getMyField{
    return _myField;
}
//在这里要注意——NSString是引用计数对象,
//因此,虽然这在技术上行得通,但是为一个NSString使用一个指派属性,可能并非一个好主意.
//然而,对于如boolean和float这样的基础类型,
//你不能采用引用计数。而指派几乎总是随你所想的。
- (void) setMyField:(NSString *)myField{
    self.myField = myField;
}
@property(nonatomic,copy) NSMutableArray *array;
--------
//以下为测试copy属性的代码:
    Demo02 *d = [[Demo02 alloc] init];
    
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObject:@"23"];
    
    NSLog(@"%@",array);
    
    d.array = array;
    
    [array addObject:@"555"];
    NSLog(@"%@",d.array);
    NSLog(@"%@",array);

//结果:
 array before:(23)
 d.array:(23)
 array after:(23, 555)

问:(MRC环境下)我怎么才能知道是否有东西保留(retain)了我的对象,如数组或其它什么?
答:基本上,你不用关心这个。按照内存规则,也就是说,如果你从alloc、new、copy、mutableCopy获得的,你必须发送它一个释放(release)。否则,保留(retain)/释放(release)它,如果你想要一会使用。除那以外,让其他类处理它们自己的内存管理。

相关文章

  • Object-C属性,实例变量

    下面是Objective-C为每个属性(Property)生成的声明,请你为它们编写代码。假设每个都通过名为_my...

  • 2020-04-05 KVC

    课程引入:成员变量、实例变量、属性,区别是什么?---分类不能添加实例变量 成员变量 -- 实例变量 -- 属性 ...

  • Python实例变量和类变量

    Python实例变量和类变量 类变量(类属性): 类变量属于类所有,所有实例共享一个变量 实例变量(实例属性) 实...

  • runtime(一)

    总结:Classget 类名,父类;实例变量;属性;实例方法,类方法,方法实现;Copy 实例变量列表;属性列...

  • 成员变量,实例变量,属性变量

    成员变量,实例变量,属性变量 成员变量 (实例变量 + 基本数据类型)UIButton *yourButton;...

  • OC编程语言课程笔记(三)属性与实例变量(极客班)

    一、类型成员之 1、属性与实例变量 实例变量:对内,类外不能访问,实例变量定义在m文件中; 属性:对外(默认公有)...

  • 实例变量和属性

    实例变量和属性是两个不同的概念, 属性是iOS5之后新增的概念,属性的正常使用依附于实例变量1,实例变量1.1,定...

  • iOS的KVC底层原理(源码分析)

    先了解成员变量、属性、实例变量 实例变量: class类进行实例化出来的对象为实例对象。成员变量: 在{ }中所声...

  • 在对象内部尽量直接访问实例变量

    在对象之外访问实例变量,总是应该通过属性。 笔者建议,在读取实例变量采用直接访问的形式,在设置实例变量通过属性。 ...

  • 实例变量和属性变量的比较

    导言 实例变量和属性变量的使用 当在对象之外使用实例变量时,我们通过属性来访问。但当我们在对象之内使用实例变量时,...

网友评论

      本文标题:Object-C属性,实例变量

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