黑马程序员-------代码实现1
来源:互联网 发布:网络布线从入门到精通 编辑:程序博客网 时间:2024/05/29 04:58
——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培训、期待与您交流! ——-
- 黑马程序员-------代码实现1
- 黑马程序员 斗地主洗牌代码实现
- 黑马程序员--代码实现2 多态
- 黑马程序员 ----------- 代码练习
- 黑马程序员---代码练习
- 黑马程序员--代码块
- 黑马程序员——代码实现进制转换
- 黑马程序员:银行业务调度系统分析及代码实现
- 黑马程序员:交通灯管理系统分析及代码实现
- 黑马程序员— 交通灯管理系统_代码实现
- 黑马程序员_银行管理系统(具体代码实现)
- 黑马程序员_银行业务调度系统代码实现
- 黑马程序员_交通灯管理系统代码实现
- 黑马程序员_实现java快速排序代码详解
- 黑马程序员------IO流文件复制4种代码实现
- 黑马程序员_代码块
- 黑马程序员 静态代码块
- 黑马程序员------代码片段记录
- OSGI 基础
- 一个字节中存在着多少个二进位1
- IOS 在storyboard中创建按钮,用代码控制按钮
- (转)chmod--改变文件的操作权限
- shell重定向,管道
- 黑马程序员-------代码实现1
- ZigZag Conversion
- JavaScript传各种方法值
- 我所理解的抽象
- Android 系统上抓取数据包方法
- 字符串中找出连续最长的数字串
- 机房重构 报表 “不能传泛型?”
- MySQL从5.5升级到5.6,TIMESTAMP的变化
- apt-get常用命令