oc46--nonatomic, retain

//
//  Person.h

#import <Foundation/Foundation.h>
#import "Room.h"
#import "Car.h"
#import "Dog.h"

@interface Person : NSObject
{
    Room *_room;
    Car *_car;
    Dog *_dog;
}
/*
- (void)setRoom:(Room *)room;
- (void)setCar:(Car *)car;
- (void)setDog:(Dog *)dog;

- (Room *)room;
- (Car *)car;
- (Dog *)dog;
 */
@property(nonatomic, retain) Room *room;//标准写法都是(nonatomic, retain)

/*
 写了retain就可以生成:
 - (void)setRoom:(Room *)room
 {
     // 1.判断传入的对象和当前对象是否一样
     if (_room != room) {
         // 2.release以前的对象
         [_room release];
         // 3.retain传入的对象
         _room = [room retain];
     }
 }
 */

/*
 readonly: 只会生成getter方法
 readwrite: 既会生成getter也会生成setter, 默认什么都不写就是readwrite

 getter: 可以给生成的getter方法起一个名称
 setter: 可以给生成的setter方法起一个名称

 retain: 就会自动帮我们生成getter/setter方法内存管理的代码,上次44,45的内容
 assign: 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的getter/setter方法, 默认什么都不写就是assign。

 多线程
 atomic :性能低(默认)
 nonatomic :性能高
 在iOS开发中99.99%都是写nonatomic,因为手机性能低。 atomic用于pc开发中。
*/
@end
//
//  Person.m

#import "Person.h"

@implementation Person

/*
- (void)setRoom:(Room *)room
{
    // 1.判断传入的对象和当前对象是否一样
    if (_room != room) {
        // 2.release以前的对象
        [_room release];
        // 3.retain传入的对象
        _room = [room retain];
    }
}
- (void)setCar:(Car *)car
{
    if (_car != car) {
        [_car release];
        _car = [car retain];
    }
}
- (void)setDog:(Dog *)dog
{
    if (_dog != dog) {
        [_dog release];
        _dog = [dog retain];
    }
}

- (Room *)room
{
    return _room;
}
- (Car *)car
{
    return _car;
}
- (Dog *)dog
{
    return _dog;
}
 */

- (void)dealloc
{
    [_room release];
    [_car release];
    [_dog release];

    NSLog(@"%s", __func__);
    [super dealloc];
}
@end
//
//  main.m
//  property修饰符

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {

    Person *p = [Person new];

    Room *r = [Room new];

    /*
//    Car *c =[Car new];
//    Dog *d = [Dog new];

//    p.room = r;
//    p.car = c;
//    p.dog = d;

//    [d release];
//    [c release];
//    [r release];
//    [p release];
     */

    p.room = r;
    [r release];

    // 换房了, 如果set方法中没有release旧值, 就会内存泄露
    Room *r2 = [Room new];
    p.room = r2;
    [r2 release];

    // 重复赋值
    p.room = r;

    [p release];
    return 0;
}
时间: 2024-10-24 06:53:18

oc46--nonatomic, retain的相关文章

nonatomic, retain,weak,strong用法详解

strong weak strong与weak是由ARC新引入的对象变量属性 ARC引入了新的对象的新生命周期限定,即零弱引用.如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil. @property(strong) MyClass *myObject; 相当于@property(retain) MyClass *myObject; @property(weak) MyOtherClass *delegate; 相当于@property(assign) MyO

写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,

写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name 写一个 setter 方法用于完成 @property (nonatomic, copy) NSString *name 答: // retain - (void)setName:(NSString *)str { [str retain]; [_name release]; _name = str; } // copy - (void)setName:(NSString

IOS编程学习(2):copy,nonatomic, retain,weak,strong用法

property属性? property:提供成员变量的访问方法的声明.控制成员变量的访问权限.控制多线程时成员变量的访问环境 .property不但可以在interface,在协议protocol.和类别category中也可以使用. synthesize 合成访问器方法? 实现property所声明的方法的定义.其实说直白就像是:property声明了一些成员变量的访问方法 ,synthesize则定义了由property声明的方法.他们之前的对应关系是  property 声明方法 ---

object-c中的assign,retain,copy,atomic,nonatomic,readonly,readwrite以及strong,weak

assign:指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy.assign指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy. retain:指定retain应该在后面的对象上调用,前一个值发送一条release消息.你可以想象一个NSString实例,它是一个对象,

转 iOS:ARC相关知识,assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

    自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误.     同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存.     总是通过属性来管理实例变量(init/dealloc除外),在dealloc中释放所有属性. dealloc中会自动加入释放实例变量的代码,因此不必要手段增加释放实例变量的代码.不需要手动调用[super  dealloc]   不要调用retain,release,autorelease,编译器会自动插入相关代码. 注

IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、 @synthesize、@property、@dynamic

IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic.                     @synthesize.@property.@dynamic #synthesize关键字: 根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来方便的存取该成员变量 . @implementation 关键字,表明类的实现 @end 结束 self 关键字 :类似于java中的t

objective-C: retain copy assgin nonatomic 等属性详解

在我们开发iOS程序时,常常会遇到:property 和synthesize,以前很懒没有仔细去理解,只是看了看别人写的书,觉得挺容易的(在这里我不得不说,现在很多本土出的土书,尤其是早期的2009年,写的是真乱,误人子弟),所以今天有时间,自己试验了一番,希望和大家讨论. property,他可以提供的功能有:提供成员变量的访问方法的声明.控制成员变量的访问权限.控制多线程时成员变量的访问环境 ). property不但可以在interface,在协议protocol .和类别category

atomic nonatomic assign retain copy strong weak 介绍

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作.         atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样:                        {lock}                                if (property != newValue) {    

IOS atomic与nonatomic,assign,copy与retain的定义和区别

http://blog.csdn.net/mars2639/article/details/7352540 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP30001163-CH17-SW1 http://blog.sina.c

NSString NSMutableString copy mutableCopy retain weak strong

NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"Shaw"; NSString *str1 = @"Root"; // NSString *str1的意思是str1