------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
内存管理学习:
1、retain 计数器+1
2、release 计数器-1
3、retainCount 获取当前的计数器
4、dealloc方法:
*对象销毁前执行的方法,需要释放对象
*一定要调用[super dealloc],要放在最后
僵尸对象
:所占用内存已经被回收的对象,僵尸对象不能再使用
野指针
:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
空指针
:没有指向任何东西的指针(存储的是nil,null,0),给空指针发送消息不会报错
谁创建,谁release
谁retain,谁release
int main(int argc, const char * argv[])
{
Person *p = [[Person alloc] init];
p.age = 28;
p.name = @"张三";
// 野指针 :指向僵尸对象(不可用内存)的指针
[p release];
// 野指针错误 EXC_BAD_ACCESS 访问了一块不可用内存
// [p release];
//[Person setAge:]: message sent to deallocated instance
// 报错:给已经释放的对象发送了一个setAge:消息
// p.age = 23;
// 空指针
p = nil;
return 0;
}
如果对象不是通过alloc产生的就不需要realease
1、set方法内存管理相关参数:
1>retain : release旧值 retain新值,适用于OC对象
2>assign : 直接赋值(默认),适用于非OC对象
3>copy : release旧值 copy新值
2、是否生成set方法
1>readwrite 同时生成setter和getter的声明和实现
2>readonly 只生成getter的声明和实现
3、多线程管理
1>nonatomic 高性能 (一般用这个)
2>atomic 低性能 (默认)
4、setter和getter方法的名称
给setter和getter方法起个名字
一般布尔类型用getter方法取个新名 is变量名
注意:不允许相同类型的参数在一起
@class
1、作用
:告诉编译器,某个名称是一个类。
@class Person; // 告诉编译器,Person是一个类
2、开发中引用一个类的规范
1> 在.h文件中用@class类声明类
2> 在.m文件中用#import来包含类的所有东西
3、两端循环引用解决方案
A包含B类,B包含A类
一端用retain,一端用assign
内存管理总结:
1、计数器的基本操作
1> retain 计数器+1
2> release 计数器-1
3> retianCount 获得计数器
对象release后叫做僵尸对象,再次访问僵尸对象会出现野指针错误
2、set方法的内存管理
1>set方法的实现:
- (void)setCar:(Car *)car
{
if ( car != _car )
{
[_car release];
_car = [car retain];
}
}
2>dealloc方法的实现(不要直接调用dealloc方法)
- (void)dealloc
{
[_car release];
[super dealloc];
}
3、@property参数
1> OC对象类型
@property (nonatomic,retain) 类名 *属性名;
@property (nonatomic,retain) Car *car;
@property (nonatomic,retain) id car;
// 被retain过的属性必须在dealloc中release属性
- (void)dealloc
{
[_car release];
[super dealloc];
}
2> 非OC对象类型(基本数据类型:int/float/enum/struct)
@property (nonatomic,assign) 类型名称 属性名;
@property (nonatomic,assign) int age;
注意:
两个类循环调用一端用retain,一端用assign
4、autorelease
1>
*有alloc、new或copy的时候需要release
*系统自带的方法中如果不包含alloc new copy,那么这些返回的对象都是已经autorelease过的
[NSString stringWithFormat:...];
2>开发中经常写一些类方法,为了快速创建autorelease的对象
*创建对象的时候不要直接使用类名,要用self,方便子类调用。
+ (id)person
{
return [[[self alloc] init] autorelease];
}
+ (id)personWithAge:(int)age
{
Person *p =[self person];
p.age = 10;
return p;
}
@autoreleasepool{
}
模型设计练习:
------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
模型设计练习:
// main.m
// 模型设计练习
#import <Foundation/Foundation.h>
#import "User.h"
#import "Status.h"
/*
思路:
1、充分考虑类之间的关系,不要把信息独立出来,比如微博中的用户应该和我们的用户类是有关联的。
2、在没有用ARC的情况的下切记要释放计数器,谁创建谁release,谁retain谁release
*/
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 创建用户信息
User *u = [[[User alloc] init] autorelease];
u.name = @"张三";
User *u2 = [[[User alloc] init] autorelease];
u2.name = @"李四";
// 创建微博信息
Status *s = [[[Status alloc] init] autorelease];
s.content = @"今天天气很好";
s.user = u;
s.reweetCount = 1; // 转发次数
Status *s2 = [[[Status alloc] init] autorelease];
s2.content = @"今天天气真的很好";
s2.reweetStatus = s; // 转发用户张三微博
s2.user = u2;
// 用户张三的姓名、微博内容和转发次数
NSLog(@"用户:%@,微博内容:%@,转发次数:%d",u.name,s.content,s.reweetCount);
// 用户李四的姓名、微博内容、转发的微博用户姓名和微博内容
NSLog(@"用户:%@,微博内容:%@。转发微博:%@---%@",u2.name,s2.content,s2.reweetStatus.user.name,s2.reweetStatus.content);
}
return 0;
}
//
// User.h
// 模型设计练习
// 姓名、微博号码、密码、头像、性别、手机、生日
#import <Foundation/Foundation.h>
// 创建一个性别枚举:有男、女
typedef enum
{
SexMan, // 男
SexWoman // 女
} Sex;
// 创建一个日期结构体
typedef struct
{
int year;
int month;
int day;
} Date;
@interface User : NSObject
// 创建成员变量,并声明和实现setter和getter方法
@property (nonatomic,retain) NSString *name; // 姓名
@property (nonatomic,retain) NSString *no; // 微博号
@property (nonatomic,retain) NSString *password; // 密码
@property (nonatomic,retain) NSString *icon; // 图像
@property (nonatomic,assign) Sex sex; // 性别
@property (nonatomic,retain) NSString *phone; // 电话
@property (nonatomic,assign) Date birthDay; // 生日
@end
//
// User.m
// 模型设计练习
#import "User.h"
@implementation User
- (void)dealloc
{
// 释放成员变量计数器
[_name release];
[_no release];
[_password release];
[_icon release];
[_phone release];
[super dealloc];
}
@end
//
// Status.h
// 模型设计练习
// 微博内容、微博配图、发送时间、微博发送人、转发的微博、被评论数、被转发数
#import <Foundation/Foundation.h>
@class User;
@interface Status : NSObject
// 创建成员变量,并声明和实现setter和getter方法
@property (nonatomic,retain) NSString *content; // 微博内容
@property (nonatomic,retain) NSString *icon; // 微博配图
@property (nonatomic,assign) time_t time; // 发送时间,实质上是long类型
@property (nonatomic,retain) User *user; // 微博发送人
@property (nonatomic,retain) Status *reweetStatus; // 转发的微博
@property (nonatomic,assign) int commentsCount; // 被评论数
@property (nonatomic,assign) int reweetCount; // 被转发数
@end
//
// Status.m
// 模型设计练习
#import "Status.h"
@implementation Status
- (void)dealloc
{
// 释放内存
[_content release];
[_icon release];
[_user release];
[_reweetStatus release];
[super dealloc];
}
@end