黑马程序员-------代码实现1

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
写一写我自己实现老师的代码的过程。
我打算写一个Book类,还有Person类,先写Book类。
我给Book类加了个_name成员。

@interface Book : NSObject
@property  NSString *name;
@property  float price;

注意_name不是基本数据结构,也是个对象。(所以它也得释放内存)
我希望有个方法可以对_name赋值,所以应该有setter和getter。
还得有init方法,所以重写init。

- (instancetype)init
{
    if (self = [super init])
        self->_name = @"";
    return self;
}

这里我把书名设为空字符串,但是它应该还是一个被创建的NSSTRING对象,也就是说_name从此不是0了。

我还写了一个

- (instancetype)initWithName:(NSString *)name
{
    if (self = [self init]) //  这里我调用了Book类的init
        self->_name = name;
    return self;
}

我调用了self的init,对你没看错,我调用了前面写的init。我的考虑是:如果Book还有出版商,价格等等属性,那么我的initWithName也需要设置这些属性啊,但是我只能接受Name一个参数,那么其余的属性应该设置为默认值。重写的init就是为了设置默认值的。
所以我先调用init设置所有属性的默认值,然后再改变Name的属性。

我在main函数里使用 [b initWithName:@”AI design”];
中断查看对象,发现程序正确。

写好了初始化和属性,就可以写dealloc方法了,老师说当对象被调用release方法后,就会被系统发送dealloc消息。必须把对象内存释放的代码放这里。

- (NSString *)description
{
    return [NSString stringWithFormat:@"Book Name:%@",_name];
}
- (void)dealloc
{
    NSLog(@"%@",self);

    [super dealloc];
}

大家应该发现我重写description方法,因为我觉得老师的代码里只是输出book release太粗糙了,要是有多个Book对象,那他们的释放时的输出都是一样的,不便于调试。所以我输出了他们的属性。

下面要把Book类型的对象的成员变量释放内存。

price是int类型,不用管,因为他会被系统释放book对象的时候,跟着一起释放。而name所指向的nsstring就不是这样了。

- (void)dealloc
{
    NSLog(@"%@",self);
    [self->_name release];
    [super dealloc];
}

测试程序没问题。
但是我发现在

@property  NSString * name;

这里有2个waring:Default property attribute ‘assign’ not appropriate for no-GC object和No ‘assign’,’retain’ or’copy’attribute is specified -’ assign’ is assumed
警告信息的意思是:“没有明确指出应该是assign还是retain或者是copy,却省的是assign”和“缺省得属性设置assign不适合非gc对象 ”,那么这两个警告信息的含义具体是什么呢?
我百度了下,粘贴如下

3.   关于setter的一些细节

下面的关键字用于描述setter方法应该如何设置property的值:
assign
表明setter方法只是进行简单的赋值运算。这个是缺省的。通常对于标量类型以及不属于该类的对象使用assign来进行描述。比如delegate。(标量,scalar type 是与aggregate type 相对而言的。scalar type代表的是一个简单的数值,如语言内置的数据类型基本上都是scalar type的;aggregate type代表的是相同类型的或者是不同类型的多个值,如数组,结构体,类等。)
retain
表明setter方法应该对新的值发送retain消息,或者说调用新值的retain方法。旧值会被发送release消息。
copy
表明setter方法中在进行赋值时应该进行拷贝赋值。旧值会被发送release消息。通过调用新值的copy方法来赋值给该property。这种赋值方式只适用于对象类型,并且要求该对象遵循NSCopying协议。
上述的这些关键字是相互排斥的,也就是说同时只能使用一种。

因为后面的课程我还没看,所以不太懂,但是看到这个,我就发现我对_name的release,有点多余。因为只要设置成retain,就会自动实现这个功能。
引用摘自:
http://blog.csdn.net/zhangxingping/article/category/870390

至于person的实现就不用说了。
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

你可能感兴趣的:(objective-c,内存管理,retain)