//
// main.m
// TestVar2
//
// Created by lishujun on 14-9-4.
// Copyright (c) 2014年 lishujun. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Address : NSObject<NSCopying>
-(void) toString;
@end
@implementation Address
-(void) toString
{
NSLog(@"this is an address");
}
-(id) copyWithZone:(NSZone *)zone
{
Address *newAddress = [[Address alloc]init];
return newAddress;
}
@end
@interface Employee : NSObject
@property (copy) Address *address; // assign, retain, copy
@end
@implementation Employee
@synthesize address;
@end
void testAssignAndRetain()
{
// 创建他们应该都是1
Address *address = [[Address alloc]init];
Address *address2 = [[Address alloc]init];
NSLog(@"a1 = %lu", [address retainCount]);
NSLog(@"a2 = %lu", [address2 retainCount]);
// 首次赋值看看会不会retain
Employee *employee = [[Employee alloc]init];
[employee setAddress: address];
NSLog(@"a1 = %lu", [address retainCount]);
NSLog(@"a2 = %lu", [address2 retainCount]);
// 看看employee.address 和 address还是不是同一个对象
[employee setAddress:address];
NSLog(@"obj address is %@" , address);
NSLog(@"obj employee.address is %@" , employee.address);
// 再次赋值看看会不会release
[employee setAddress:address2];
NSLog(@"a1 = %lu", [address retainCount]);
NSLog(@"a2 = %lu", [address2 retainCount]);
// 看看使用的时候会不会retain
for (int i=0; i<10; i++) {
[employee.address toString];
NSLog(@"a2 = %lu", [address2 retainCount]);
}
}
void testCopy1()
{
Address *address = [[Address alloc]init];
Address *address2 = [[Address alloc]init];
Employee *employee = [[Employee alloc]init];
// 看看employee.address 和 address还是不是同一个对象
[employee setAddress:address];
NSLog(@"%@" , address);
NSLog(@"%@" , address2);
NSLog(@"%@" , employee.address);
// 看看employee.address 和 address还是不是同一个对象
[employee setAddress:address2];
NSLog(@"%@" , address);
NSLog(@"%@" , address2);
NSLog(@"%@" , employee.address); //之前的对象被替换
}
void testCopy2()
{
Address *address = [[Address alloc]init];
Employee *employee = [[Employee alloc]init];
[employee setAddress:address];
// 看看使用对象会不会retain
for (int i=0; i<10; i++) {
//[employee.address toString];
NSLog(@"address = %lu", [address retainCount]);
NSLog(@"e.address = %lu", [employee.address retainCount]);
}
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
//testAssignAndRetain();
testCopy2();
}
return 0;
}