[Objective-C] 纯文本查看 复制代码
WZKPerson.h
#import <Foundation/Foundation.h>
@interface WZKPerson : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@end
WZKPerson.m
#import "WZKPerson.h"
@implementation WZKPerson
-(void)dealloc
{
self.name=nil;
/*最后一定要调用父类的dealloc方法;
目的:一是父类可能有其他引用对象需要释放;二是当前对象真正的释放操作是在super的dealloc中完成的;
*/
[super dealloc];
}
@end
main.m(部分代码)
//调用alloc,引用计数+1
WZKPerson *personTest=[[WZKPerson alloc] init];
personTest.name=@"test";
personTest.age=30;
//输出personTest对象的引用计数
NSLog(@"personTest的引用计数:%lu",[personTest retainCount]);
//输出结果:personTest的引用计数:1
//执行personTest的dealloc方法
//调用过release方法之后,personTest指向的对象就会被销毁,但是此时变量personTest中还存放着WZKPerson对象的地址
[personTest release];
//如果不设置personTest=nil,则personTest就是一个野指针,它指向的内存不属于这个程序,非常危险
personTest=nil;
//如果不设置personTest=nil,此时再调用personTest的release方法会报错
//如果设置了personTest=nil,此时personTest已经是空指针了,则oc中给空指针发送消息是不会报错的
[personTest release];
WZKPerson *personTest2=[[WZKPerson alloc] init];
personTest2.name=@"test2";
personTest2.age=30;
//输出结果:personTest的引用计数:1
NSLog(@"personTest2的引用计数:%lu",[personTest2 retainCount]);
//引用计数+1
[personTest2 retain];
//输出结果:personTest的引用计数:2
NSLog(@"personTest2的引用计数:%lu",[personTest2 retainCount]);
//引用计数-1
[personTest2 release];
//输出结果:personTest的引用计数:1
NSLog(@"personTest2的引用计数:%lu",[personTest2 retainCount]);
//执行personTest2的dealloc方法
[personTest2 release];
personTest2=nil;
[Objective-C] 纯文本查看 复制代码
WZKPerson.h
//构造函数
-(WZKPerson *)initWithName:(NSString *)name age:(NSInteger)age;
//获取对象的类方法
+(WZKPerson *)personWithName:(NSString *)name;
WZKPerson.m
-(WZKPerson *)initWithName:(NSString *)name age:(NSInteger)age
{
self=[super init];
if (self) {
_name=[name copy];
_age=age;
}
return self;
}
+(WZKPerson *)personWithName:(NSString *)name
{
//这里调用了autorelease
//OC类库中的类方法一般都不需要手动释放,内部已经调用了autorelease方法;
WZKPerson *person=[[[WZKPerson alloc] init] autorelease];
return person;
}
main.m(部分代码)
int main(int argc, const char * argv[]) {
@autoreleasepool {
WZKPerson *person1=[[WZKPerson alloc] init];
//调用autorelease方法,后面就不需要手动调用release方法了
[person1 autorelease];
//由于autorelease是延迟释放(延迟到自动释放池销毁),
//所以这里仍然可以使用person1对象
person1.name=@"Kevin";
//调用autorelease方法
WZKPerson *person2=[[[WZKPerson alloc] initWithName:@"Kevin" age:27] autorelease];
//内部已经调用了autorelease,所以不需要手动释放
//另外由于内存管理原则,在外部不使用alloc、new、copy操作,
//就不需要调用release或autorelease,所以这个操作是放到类方法内部进行完成
WZKPerson *person3=[WZKPerson personWithName:@"Kevin"];
}
return 0;
}