oc

1.weak属性需要在dealloc中置nil么?

不需要, weak并不引用指向对象, 何况就算引用也不需要. dealloc中在ARC情况下一般用作解除KVO和Notification的监听

2。@synthesize和@dynamic分别有什么作用?

@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _var;

@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。

@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成

3.ARC下,不显示指定任何属性关键字时,默认的关键字都有哪些?

线程同步相关:默认为atomic,即默认为线程安全的。

读写属性:默认为readwrite, 即可读写

内存相关:默认为strong

4,用@property声明的 NSString(或NSArray,NSDictionary) 经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

因为如果赋给该属性的值是一个NSMutableString类型的话,那么该属性的值就会随着该可变字符串的值的改变而改变,而这种改变在大多的情况下并不是我们所想要的,为了避免这种情况给我们带来的困扰,我们需要将该属性声明为copy,这样的话,当给该属性赋值的时候,系统会将对象复制后再赋值给该属性

5.objc中向一个对象发送消息[obj foo]objc_msgSend()函数之间有什么关系?

在 Objective-C 中向任何一个对象发送任何的消息,最终都会间接地调用到了objc_msgSend()函数。

6,runtime如何实现weak变量的自动置nil?

在 runtime 阶段,对于 weak 变量而言,系统使用 hash 表进行管理,将weak 变量所指向的地址作为 hash 表的 key,当某个对象的引用计数为零的时候,系统根据对象的内存地址找到所有指向该对象的 weak 变量,并将这些 weak 变量置为 nil。

7.runloop的内部实现实质上是一个循环机制。

function loop() { initialize(); do { var message = get_next_message(); process_message(message); } while (message != quit); }

8.如何调试BAD_ACCESS错误

解决使用BAD_ACCESS的错误的一种方法可以使用NSZombileEnabled的方法

xcode -->EditScheme->Diagnostics    ----———选中enable zombile objects

xcode->Scheme->EditScheme    ———————   选中enable zombile objects

9.lldb(gdb)常用的调试命令?

gdb常用的调试命令在控制台输入 help  po   nex t  finish 等等。

10.XIB中User Defined Runtime Attributes如何使用?

runtime attributes  这个使用很方便,可以设置一般的属性~  比如颜色  圆形边框  等等。

11关于arc下使用iboutlet的问题。

.http://www.cnblogs.com/scorpiozj/p/3337710.html

weak    strong  区别就在于

weak是弱引用,它的指向,并不会修改影响计数的影响。

strong是强引用。会影响计数的变化。计数为0改对象销毁。

12.kvo  kvc的问题

-1>delegate 可以使用类A调用类B, 当类B想回调类A的方法的时候, 要用到delegate。

-0>protocol 是协议,专门写一个.h文件类型是protocol的。这个文件专门写一些不能实现的方法。比如汽车类 都能run

方法有option的可选  也有requied   大汽车实现这个协议,必须去实现里面必须要实现的方法。

-1>KVC很容易理解的就是key-valuecoding一个非正式的protocol  (一个对象拥有某些属性 也就是只要是一个对象都可以有这个属性)

[p setValue:newName forKey:@"name”];  setValue   forkey这个属性。和[p valueForKey:@"name”];

-2>kvo的一个demo  实质上实现的就是观察值的变化执行回调方法。

比如说界面点击button 来修改界面的值那就需要观察着 观察了。就是addobserver 来观察值的变化。。

1,注册 2.实现回调方法3.移除观察。

demo:- (void)viewDidLoad {

[super viewDidLoad];

changeData=[[ChangeData alloc] init];

[changeData setValue:@"value1" forKey:@"name"];

[changeData addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

UIButton * b=[[UIButton alloc] initWithFrame:CGRectMake(50,20  ,300 ,20 )];

[b setBackgroundColor:[UIColor redColor]];

[b setTitle:@"点击监听" forState:(UIControlStateNormal)];

[b addTarget:self action:@selector(changeAction) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:b];

}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

if([keyPath isEqualToString:@"name"])

{

UIAlertView * alertView=[[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"值已经被修改" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

[alertView show];

}

}

- (void)dealloc

{

//处理资源。

[changeData removeObserver:self forKeyPath:@"name"];

[changeData setValue:@"value11" forKey:@"name"];

}

-(void)changeAction

{

//修改值

[changeData setValue:@"value11" forKey:@"name"];

}

1.[※※]addObserver:forKeyPath: options:context:各个参数的作用分别是什么,observer中需要实现哪个方法才能获得KVO回调?

[model addObserver:self forKeyPath:@“text” options:NSKeyValueObservingOptionNew context:nil];

这条语句意思是:当model的text属性变化时通知self,其中NSKeyValueObservingOptionNew 可以变换,context参数是void*类型,因此可以传递自己想传递的任何类型。

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

2.[※※※]如何手动触发一个value的KVO

[※※※]若一个类有实例变量NSString *_foo,调用setValue:forKey:时,可以以foo还是_foo作为key?_foo

[※※※※]KVC的keyPath中的集合运算符如何使用?

集合--存

Book *book =[[[Book alloc] init] autorelease];

Book *book1=[[[Book alloc] init] autorelease];

[book1 setValue:@"5.0" forKey:@"price"];

Book *book2=[[[Book alloc] init] autorelease];

[book2 setValue:@"4.0" forKey:@"price"];

NSArray *books=[NSArray arrayWithObjects:book1,book2,nil];

[book setValue:books forKey:@"relativeBooks"];

集合使用--

NSLog(@"relative books price:%@",[bookvalueForKeyPath:@"relativeBooks.price"]);

NSLog(@"relative books count:%@",[bookvalueForKeyPath:@"relativeBooks.@count"]);

3.[※※※※]KVC和KVO的keyPath一定是属性么?

KeyPath说白了就是我们平时使用点操作访问某个对象的属性时所写的那个字符串

4[※※※※※]如何关闭默认的KVO的默认实现,并进入自定义的KVO实现?

http://blog.csdn.net/songhongri/article/details/17515377

[※※※※※]apple用什么方式实现对一个对象的KVO?

http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html

当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。

派生类在被重写的 setter 方法实现真正的通知机制,就如前面手动实现键值观察那样。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要的通知机制。当然前提是要通过遵循 KVO 的属性设置方式来变更属性值,如果仅是直接修改属性对应的成员变量,是无法实现 KVO 的。

同时派生类还重写了 class 方法以“欺骗”外部调用者它就是起初的那个类。然后系统将这个对象的 isa 指针指向这个新诞生的派生类,因此这个对象就成为该派生类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制。此外,派生类还重写了 dealloc 方法来释放资源。

你可能感兴趣的:(oc)