ios基础--内存案例

来源:互联网 发布:oa源码 java 编辑:程序博客网 时间:2024/05/22 00:28
111111111111111111111111111111111111111111
assign:简单赋值,不更改索引计数(Reference Counting)。


copy到另外一个NSString之后,地址为0x2222,内容相同,新的对象retain为1,旧有对象没有变化


retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1


也就是说:retain是指针拷贝,copy是内容拷贝
222222222222222222222222222222222222222222222
strong类似于retain,引用时候会引用计算+1,weak相反,不会改变引用计数


在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)
3333333333333333333333333333333333333333333333333
使用assign:对基础数据类型(NSInteger)和C数据类型(int ,float,double,char等)


使用copy:对NSString


使用retain:对其他NSObject和其子类。

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

person.h

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
    Dog *_dog;
}

@property (retain) Dog *dog;
@end


person.m

#import "Person.h"


@implementation Person
@synthesize dog = _dog;
- (void) dealloc
{
    NSLog(@"person is dealloc");
    // 把人拥有的_dog释放
    self.dog = nil;
    [super dealloc];
}


@end

dog.h

#import <Foundation/Foundation.h>


@interface Dog : NSObject
{
    int _ID;
}
@property int ID;


@end

dog.m


#import "Dog.h"


@implementation Dog


@synthesize ID = _ID;


- (void) dealloc
{
    NSLog(@"dog %d is dealloc", _ID);
    [super dealloc];                                  //dealloc必须要释放dog(retain)
}
@end

mian.m


#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
// Person
// Dog.
// Person Dog.


int main (int argc, const char * argv[])
{


    @autoreleasepool {
        NSLog(@"Hello, World!");
        
        Dog *dog1 = [[Dog alloc] init];
        [dog1 setID:1];
        
        Dog *dog2 = [[Dog alloc] init];
        [dog2 setID:2];
        
        Person *xiaoLi = [[Person alloc] init];
        [xiaoLi setDog:dog1];
        
        [xiaoLi setDog:dog2];
        
        [dog1 release];
        [xiaoLi release];
        [dog2 release];
        
#if 0
        Dog *dog1 = [[Dog alloc] init];
        [dog1 setID:1];
        
        Person *xiaoLi = [[Person alloc] init];
        // 小丽要遛狗
        [xiaoLi setDog:dog1];
        
        Person *xiaoWang = [[Person alloc] init];
        [xiaoWang setDog:dog1];
        
        NSLog(@"dog1 retain count is %ld", 
              [dog1 retainCount]);
        // dog1 retain count is 3
        
        [dog1 release];
        NSLog(@"dog1 retain count2 is %ld", 
              [dog1 retainCount]);
        // dog1 retain count2 is 2
        
        [xiaoWang release];
        
        NSLog(@"dog1 retain count3 is %ld", 
              [dog1 retainCount]);
        // person is dealloc
       //  dog1 retain count3 is 1
    
        [xiaoLi release];


        // person is dealloc
        // dog 1 is dealloc
#endif


    }
    return 0;
}


assign,retain,copy

1、foo=value;//简单的引用赋值

2、foo=[value retain];//引用赋值,并且增加value的计数器

3、foo=[value copy];//将value复制了一份给foo,复制后,foo和value就毫无关系

111111111111111111111retain

@class Dog

@property(nonatomic,retain) Dog *dog;


- (void) setDog:(Dog *)dog

{

  if(_dog != dog){//判断是否需要重新赋值

[_dog release];//释放旧引用,计数器-1

_dog = [dog retain];//重新赋值,计数器+1

}


}

22222222222222222222222assign

@property(nonatomic,assign) int count

- (void)setCount:(int)count

{

_count =count

}

3333333333333333333333333333copy

@property (nonatomic,copy)NSString* str;

-(void)setStr:(NSString *)str

{

      if(_str != str){//判断是否需要重新赋值

            [_str release];//释放旧引用,计数器-1

           _str = [str copy];//重新赋值,使用copy


      }

}

=================================================================================

===========================================================================================

===================================================================================

copy和retain实例分析

@property(nonatomic,copy)NSString *str;

NSMutableString *s = [[NSMutableString alloc] setString:@"hello"];

p.str = s;//此时str的值为“”hello“”

[s sppendstring:@"world"]//此时,s的值为“”hello world“”,但str的值依然是“”hello“”

 但是如果开始时str的申明为:

    @property(nonatomic,retain)NSString *str;

    那么,在进行完 [s appendString:@"world"]之后,str的值将变为"hello world".因为str与s共用一块内存,内容完全相同,而s是可以改变的,所以s改变后,str也将改变。


0 0