------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
参照04set方法的内存管理,我们将那道题用@property来实现一下:
题目:有一个学生,学号89757,姓名林俊杰,他有一辆小车和一只可爱的小狗
那么问题来了,请用代码描述上述关系,并用@property的相关参数对其进行内存管理。
解答:
分析和内存分析图参照04set方法的内存管理
代码:
Car类:
Car.h文件
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
Car.m文件
#import "Car.h"
@implementation Car
- (void)dealloc
{
NSLog(@"Car-----dealloc!");
[super dealloc];
}
@end
Dog类:
Dog.h文件
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
Dog.m文件
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog-----dealloc!");
[super dealloc];
}
@end
Student类
Student.h文件
#import <Foundation/Foundation.h>
@class Car;
@class Dog;
@interface Student : NSObject
@property (nonatomic, assign) int no;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) Dog *dog;
@end
Student.m文件
#import "Student.h"
@implementation Student
- (void)dealloc
{
NSLog(@"Student-----dealloc!");
[_name release];
[_car release];
[_dog release];
[super dealloc];
}
@end
main()主函数
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Car.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
Student *s = [[Student alloc] init];
NSString *n = @"林俊杰";
s.name = n;
s.no = 89757;
Car *c = [[Car alloc] init];
Dog *d = [[Dog alloc] init];
s.car = c;
s.dog = d;
[s release];
[c release];
[d release];
return 0;
}
运行程序:
对比set方法的内存管理,我们发现,变化的部分就是通过@property的相关参数替代了set方法的实现,解放了程序员的双手,不用去敲没有技术含量的set方法。
使用了@property的相关参数(retain、assign)之后,编译器会自动生成对应的set方法内存管理的代码。
关于@property参数的总结:
/*
1.set方法内存管理相关的参数
* retain : release旧值,retain新值(适用于OC对象类型)
* assign : 直接赋值(默认,适用于非OC对象类型)
* copy : release旧值,copy新值
2.是否要生成set方法
* readwrite : 同时生成setter和getter的声明、实现(默认)
* readonly : 只会生成getter的声明、实现
3.多线程管理
* nonatomic : 性能高 (一般就用这个)
* atomic : 性能低(默认)
4.setter和getter方法的名称
* setter : 决定了set方法的名称,一定要有个冒号 :
* getter : 决定了get方法的名称(一般用在BOOL类型)
*/
例如:
@interface Person : NSObject
// 返回BOOL类型的方法名一般以is开头
@property (getter = isRich) BOOL rich;
@property (nonatomic, assign, readwrite) int weight;
// setWeight:
// weight
@property (readwrite, assign) int height;
@property (nonatomic, assign) int age;
@property (retain) NSString *name;
@end