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, 还可以在里面写很多参数, 这个我们后面慢慢详解~~~
好了, 这次我们讲到这里, 下次我们继续~~~