黑马程序员-学习OC中相关问题与解决

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 

问题1,
#import <Foundation/Foundation.h>
@interface Student :NSObject
{
 //
 BOOL sex;为什么不能用
BOOL
}

解答:enum Sex
{
    FSexMale,//男

    FSexFemale,//
    FSexOther//其他
}

BOOL  Sex //YES  NO

1.用枚举可以定义多个值,就拿性别来说,现在不仅仅只有男女了,还有男变女,还有女变男,还有没搞清楚的

2.用枚举,FSexMale别人一看就知道他是男性,用BOOL  你说YES是男还是NO是男,开发的时候,你看到别人Sex用BOOL类型,你能保证确定他YES就是表示的男吗?

 

问题2:

@interface Student : NSObject
{

//只允许外界访问no,不允许修改no 只需要提供get方法,也就是只读。
int no;

问题1:在这里no的值不就是0,也不允许在声明这里初始化,它的值就是0了?只读的话没别的可能值?

答: 其实在调用的时候,也就是new的时候会给成员变量初始化,这里面就用到了以后会讲的new 可以分成alloc(分配存储空间),init(初始化对象),因为有init,他的作用是在初始化的 时候让成员变量在创建的时候默认值为0.如果想要他的初始化不为0的话,可以重写他的init方法。

问题2:set方法不也可以修改数据么,只是多了一个过滤,用方法修改变量,就叫不让外界知道内部细节?保证成员变量安全性?set完毕后,成员变量数值改变了吗?

答: 这个怎么说呢,先来说说成员变量的作用域有4个(1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。
(2)@protected (受保护的)只能在当前类和子类的对象方法中访问
(3)@private (私有的)只能在当前类的对象方法中才能直接访问
(4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问
现在的问题是:我们不可以让人谁便的来修改我们好不容易写出来的代码,这个时候我们就想到了封装。可以包装一些代码,将变化隔离。
而:set 则是让给外界的一个方法可以让外界来修改成员变量的值。

 

问题3:封装屏蔽内部的赋值过程.屏蔽的过程是set,get方法内部吗?对外部来说我们看到的与不屏蔽有什么不同。、
答: 就我个人的理解,封装屏蔽的是恶意的随意的修改代码,屏蔽的话你只能通过set方法来修改他,不屏蔽的话你可以直接成员变量来修改他。也就不关get方法的什么事情了。

 

问题4:

如果在main函数中定义一个下划线变量,
1,如果有同名成员变量。
2,如果没有同名成员变量,仅仅会作为一个普通变量吗?


问题5

- (void)test
{
 int _age = 20;//
此处的_age 是局部变量还是成员变量?
 NSLog(@"Person的年龄是%d岁",_age);//输出20,没必要大老远去访问成员变量,就近原则。
 
}

解答:
成员变量和局部变量同名

当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
用self访问成员变量,区分同名的局部变量

 

问题6.

在Card.m文件里用到了再包含#import "Person.h"
@implementation Card
- (void) dealloc
{
 NSLog(@"Car被销毁了
");
 [_person release];//要不这句person的方法无实现


问题7
arc 是编译器特性。


问题8

block与函数的比较

感觉按老师的意思就是和用Typedef定义一个指向函数的指针一样,能够封装一个函数,代码多起来之后,每次使用到这个方法不需要再重新定义一遍,增加代码的复用性和可读性,这些东西,只有在编一个大型点项目,代码很多的情况下感觉才会深刻,整体更有逻辑性


block最NB之处在于词法闭包,简单来说,你在一个方法,比如叫print:中定义了一个block,那么这个block中的代码和print:方法中的定义的其他局部变量一起形成了一个封闭的环境(闭包),block中可以直接访问print:方法的局部变量。但如果你定义一个新函数来实现block中的操作代码,然后在print:方法中调用它,那么在新函数中是无法直接访问print:方法中的局部变量的,你必须把局部变量当作参数传递给新函数。显然,这种情况下用block就方便多了

 

问题9

@interface Person : NSObject<Myprotocol,Myprotoco2>

@property (nonatomic, strong) id<Myprotocol2> obj;
//obj对象声明在Person类里,本身是拥有Myprotocol,Myprotoco2,这里的id<Myprotocol2> obj是要求obj对象只遵守Myprotocol2对吗?

还是说类遵守的协议,而类创建的对象是不遵守的,像Person<MyProtocol3> *obj4 = [[Person alloc] init];这里的<MyProtocol3>协议的obj4遵守协议1,2,3吗?

@end

解决:


最后一句obj4 应该是遵守 1,2,3协议的
因为首先,他是Person对象,那么Person对象是遵守1 2协议的
而在创建的时候 obj4这个对象的时候 又指明必须要遵守3协议
所以就遵守1 2 3协议了

但是你所说的obj对象本身在Person类当中,作为Person类的一个成员变量,这个我认为是不具有Person类的协议的,因为他是一个成员变量,只不过是一个对象而已,所以这里有点混淆。要搞清楚协议的作用,是声明方法,遵守了协议就拥有了这个协议声明的方法,那么谁能拥有这些方法,只有对象,那么这里obj只是Person类的一个成员变量,只不过是一个NSObject 的对象而已,不是Person的对象。所以不能遵守Person的协议!

property (nonatomic, strong) id<Myprotocol2> obj;
这句话的意思创建一个必须遵守协议<Myprotocol2>的NSObject对象,和person里已经有协议没有关系,并不是所有含有协议的类创建出来的对象都含有类中的协议,主要还看对象本身又没有协议。
你写的第二句如果是按MJ老师讲的,应该因为<Myprotocol1>遵守<Myprotocol3>,所以Person对象obj4创建出来才包含了三个协议

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值