天天看点

黑马程序员——IOS基础——OC内存管理-set方法内存管理及微博模型设计

------- android培训、java培训、期待与您交流!

补充:

在car.m的实现中    访问成员变量4种方式:

_speed :直接访问成员变量

self ->_speed: 直接访问成员变量

self.speed : get方法

[self speed] :get方法

int main(){
	Person *p = [[Person alloc] init];
	p.age=20;

	Car *c1 = [[Car alloc] init];
	c1.speed = 250;
	p.car = c1;

	Car *c2 = [[Car alloc] init];
	c2.speed = 300;
	p.car = c2;
	//这里如果多写了一次p.car = c2;会报错的,看下面set方法解释
	[c2.release];
	[c1 release];
	[p release];
	return 0;
}
           

当这个人换车的时候,需要在Person.m的set方法中把原来的车release

注意:

为了防止多写了一次p.car = c2;   因为 _car 就是c2 

这里即使_car 为空:[nil release]也不为错,如果之前有car,就可以release

- (void)setCar:(Car *)car
{
	if(car != _car)  
	{
		[_car release];   
		_car = [car retain];
	}
}
           

dealloc方法的代码规范

>一定要[super dealloc],而且放到最后面

>对self(当前)所拥有的其他对象做一次release

- (void)dealloc{
	[_car release];
	[super dealloc];
}
           

但注意:

Strudent *stu = [[Student alloc] init];
//这行代码有内存泄露 
stu.car = [[Car alloc] init];  //Car 的计数器为2
[stu release];  //Car 的计数器为 1
//这行也有内存泄露
[[Car alloc] init].apeed = 100;
           

================================= property的内存管理=================================

Student.h中声明:

//retain : 生成的set方法里面,release旧值,retain新值

@property (retain) Book *book;
@preperty (retain) NSString *name;
           

Student.m中实现:

重写dealloc:

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

Property中4种参数:同一种类型只能写一种

1.内存管理相关的参数:

>retain:release旧值,retain新值(适用于OC对象类型)

>assign:默认:@property (assign) int age;(适用于非OC对象类型)

>copy:release旧值,copy新值

2.是否要生成set方法:

>@property  (readonly) int height;//只会声称getter声明、实现

>@property (readwrite) int height;//默认,同时生成setter和getter的声明、实现

3.多线程管理

>nonatomic:生成setter的时候不要加索,性能高

@property (nonatomic,assign) int age; 

>atomic:性能低(默认)

4.setter和getter方法的名称:一般用在布尔类型get方法

@property (getter = isRich) BOOL rich; //BOOL b = p.isRich;布尔类型 一般以is开头

@property (getter = abc, setter = setAbc:) int weight; //只影响方法名,不影响成员变量名

综合:

@property (nonatomic, assign, readwrite,setter= tizhong) int weight;

=================================微博模型设计=================================

一.设计一个微博用户类,包含以下属性:姓名 微博号码 密码 头像 性别 手机 生日

User.h:声明

#import <Foundation/Foundation.h>

typedef enum{
	SexMan,
	SexWoman
} Sex;//性别  ,不是对象,是基本数据类型
typede struct {
	int year;
	int month;
	int day;
} Date; //结构体表示生日,不是对象,是基本数据类型

//姓名 微博号码 密码 头像 性别 手机 生日
@interface User : NSObject
@property (nonatomic, retain) NSString *name;
@Property (nonatomic, retain) NSString *account;  //账号
@Property (nonatomic, retain) NSString *password;
//图象,配图,用的都是url,还是字符串
@Property (nonatomic, retain) NSString *icon; //头像
@property (nonatomic, assign) Sex sex; //不是OC对象,用assign ,是OC对象用retain
@property (nonatomic, retain) NSString *phone;
@property (nonatomic, assign) Data birthday;

@end
           

User.m:实现

#import "User.h"
#implementation User
- (void)dealloc{
	[_name release];
	[_account release];
	[_icon release];
	[_password release];
	[_phone release];
	
}
           

二.设计一条微博,包含以下属性:微博内容、微博配图、发送时间、微博发送人、转发的微博、被评论数、被转发数

Status.h:声明

#import <Foundation/Foundation.h>
#import "User.h"
@interface Status : NSObject
@property (nonatomic, retain) NSString *test;
@property (nonatomic, retain) NSString *icon;
@property (nonatomic, assign) time_t time; //time_t 就是long,从1970-1-1 00:00:00开始,一共度过多少毫秒
@property (nonatomic, retain) User *user; //微博发送人
@property (nonatomic, retain) Status *retweetStatus; //转发的微博
@property (nonatomic, assign) int commentsCount; //被评论数
@property (nonatomic, assign) int retweetsCount; //被转发数


@end
           

Status.m:实现

#import "Status.h"
@implementation Status
- (void)dealloc{
	[_test release];
	[_icon release];
	[_user release];
	[_retweetStatus release];
	
	[super release];//===============一定别忘了===============
	
}
@end
           

main.m:调用

#import <Foundation/Foundation.h>
#import "User.h"
#import "Status.h"

int main(){
	User *u1 = [[User alloc] init];
	u1.name = @"2B";
	User *u2 = [[User alloc] init];
	u2.name = @"SB";
	
	Status *s1 = [[Status alloc] init];
	s1.text = @"今天天气真好";
	s1.user = u1; //2B这个用户发送了s1这条微博
	
	Status *s2 = [[Status alloc] init];
	s2.text = @"今天天气真的是很好";
	s2.retweetsCount = s1;
	s2.user = u2; //SB这个用户转发了2B的那条微博

	[u2 release];
	[u1 release];
	[s2 release];
	[s1 release];
	return 0;
}
           

------- android培训、java培训、期待与您交流!