Objective - C基础: 第五天 - 4.@property - 内存管理

在前面, 我们基本上讲完了OC的内存管理, 但如果按照我们之前那样子做, 我们需要写非常非常多的代码, 在我们实际开发中, 不可能就只有那么一两个对象, 所以我们需要写的set方法和get方法就一大堆, 比如下面这个例子:

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

@interface Person : NSObject
{
    int _age;
    Book *_book;
}

- (void)setAge:(int)age;
- (int)age;

- (void)setBook:(Book *)book;
- (Book *)book;

@end

@implementation Person
- (void)setAge:(int)age
{
    _age = age;
}
- (int)age
{
    return _age;
}

- (void)setBook:(Book *)book
{
    if (_book != book)
    {
        [_book release];
        _book = [book retain];
    }
}
- (Book *)book
{
    return _book;
}

- (void)dealloc
{
    [_book release];
    [super dealloc];
}
@end


#import <Foundation/Foundation.h>

@interface Book : NSObject
@end

@implementation Book
@end

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

int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc]init];
    
    Book *b = [[Book alloc]init];
    
    p.book = b;
    
    NSLog(@"%ld", [b retainCount]);
    
    [b release];
    [p release];
    
    return 0;
}

没错, 按照上面的例子, 我们是可以进行正常的内存管理, 但这样子写, 会累死人, 因为一旦创建一个对象就要写一次set, get方法, 而且这些代码都是非常的垃圾, 非常的恶心, 一旦对象多了, 那么整个项目就乱七八糟, 几乎都是set和get方法, 为了解决这个问题, 其实可以运用@property, 比如:


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

@interface Person : NSObject

@property int age;

@property (retain) Book *book;

@end

只要在@property后加上一个小括号并且写上retain, 那么就可以自动生成这一堆代码:

- (void)setBook:(Book *)book
{
    if (_book != book)
    {
        [_book release];
        _book = [book retain];
    }
}
- (Book *)book
{
    return _book;
}



有了@property(retain)之后, 从此我们写代码就非常的舒服了, 不用再去写什么set, get方法了~~当然@property并不是万能的, dealloc方法还是需要我们自己去写~~如果不想写dealloc, apple官方也有提供一个方法, 那么就是ARC机制啦, 这个我们后面会讲到~~





当然, 在@property()的小括号里面, 不只是写retain, 还可以在里面写很多参数, 这个我们后面慢慢详解~~~








好了, 这次我们讲到这里, 下次我们继续~~~

posted @ 2015-01-26 19:37  背着吉他去流浪  阅读(166)  评论(0编辑  收藏  举报