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

浙公网安备 33010602011771号