我添加了多个观察者,在dealloc里ios 移除观察者掉,ios 移除观察者一次就行么

主题 : 我添加了多个观察者,在dealloc里移除掉,移除一次就行么?
级别: 骑士
可可豆: 1859 CB
威望: 1859 点
在线时间: 183(时)
发自: Web Page
来源于&&分类
我添加了多个观察者,在dealloc里移除掉,移除一次就行么?&&&
我再viewDidLoad里添加了观察者 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(play) name:Notification_Play object: nil];    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(pausePlay) name:Notification_Pause object: nil];再dealloc里移除时候 [[NSNotificationCenter defaultCenter] removeObserver:self];这一句话就够了么?求指导
级别: 侠客
UID: 57113
可可豆: 532 CB
威望: 532 点
在线时间: 85(时)
发自: Web Page
YES YES YES!
码累了吧,来,抽根烟,长寿
级别: 骑士
可可豆: 1859 CB
威望: 1859 点
在线时间: 183(时)
发自: Web Page
回 1楼(hunter2014) 的帖子
OK~~~~~~~~~~~~
级别: 新手上路
可可豆: 1 CB
威望: 1 点
在线时间: 8(时)
发自: Web Page
亲&& 这不叫观察者&& 这是通知!!!
关注本帖(如果有新回复会站内信通知您)
8*2-5 正确答案:11
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版版权声明:原创作品,谢绝转载!否则将追究法律责任。
观察者设计模式
在观察者设计模式里面,一个对象通知其他的对象一些状态的改变。涉及这些对象不需要知道另一个对象---因此鼓励解耦设计模式。这个设计模式经常被用来通知感兴趣的对象当一个属性被改变时候。
通常实现需要一个观察者注册另一个对象感兴趣的状态。当状态改变,所有的观察者对象被通知改变了。苹果的远程通知服务就是一个全球性的例子。
如果你一直坚持MVC的概念,你需要允许你的model对象和View对象通信,但是不能直接引用,这就是观察者设计模式的由来。
cocoa实现观察者有两个相似的方法:通知和键值观察:
通知:不要被本地通知和远程通知迷惑,通知是根据订阅和通知的模式允许一个对象(通知者)发送消息给另一些对象(订阅者也就是监听者)。这个通知者不需要知道订阅者的任何信息。
苹果公司大量的使用通知,例如当键盘隐藏时候系统发送一个UIKeyboardWillShowNotification/UIKeyboardWillHideNotification通知。当你的应用进入后台系统发送一个UIApplicationDidEnterBackgroundNotification 通知。
打开UIApplication头文件。在文件最后你会看到系统发出的20个通知。
怎么使用通知呢
在AlbumView实现文件里面插入下面代码在[self addSubview:indicator];后面initWithFrame:albumCover:里面
[[ defaultCenter] postNotificationName:@"BLDownloadImageNotification"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& object:self
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& userInfo:@{@"imageView":coverImage, @"coverUrl":albumCover}];
这一行通过NSNotificationCenter 的一个单例发送一个通知。这个通知包含了一个UIImageView用来填充专辑封面和一个下载图片的URL。这里面的所有信息你需要在你的下载任务里面执行。
在libraryAPI实现文件里面的init方法isOnline = NO:后面添加下面代码:
[[ defaultCenter] addObserver:self selector:@selector(downloadImage:) name:@"BLDownloadImageNotification" object:nil];
这个就是观察者。每次AlbumView 类发送一个BLDownloadImageNotification 通知。这个libraryAPI为这个通知注册一个观察者。系统通知libraryAPI。并且libraryAPI执行downloadImage:作为回答。
然后在实现downloadImage:之前你必须取消你注册的这个通知当你的类销毁的时候。如果不这样做通知就会发送到一个销毁的对象。这就是应用崩溃的结果。
在libraryAPI实现文件里面添加下面代码:
- (void)dealloc
&&& [[ defaultCenter] removeObserver:self];
当这个类销毁时候。他作为观察者从所有已经注册的通知中移除掉。还有一件事情要做,我们保存下载的图片。这样应用不需要下载相同的图片了。
PersistencyManager有文件加入下面两个方法原型:
- (void)saveImage:(UIImage*)image filename:(*) - (UIImage*)getImage:(*)
实现文件里面:
- (void)saveImage:(UIImage*)image filename:(*)filename { filename = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", filename];
*data = UIImagePNGRepresentation(image); [data writeToFile:filename atomically:YES]; } - (UIImage*)getImage:(*)filename { filename = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", filename];
*data = [ dataWithContentsOfFile:filename]; return [UIImage imageWithData:data]; }
这段代码是下载图片保存在沙盒,并且如果沙盒没有这个图片路径就会返回nil。
下面在libraryAPI加入下面代码:
- (void)downloadImage:(*)notification { // 1 UIImageView *imageView = notification.userInfo[@"imageView"];
*coverUrl = notification.userInfo[@"coverUrl"]; // 2 imageView.image = [persistencyManager getImage:[coverUrl lastPathComponent]]; if (imageView.image == nil) { // 3 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ UIImage *image = [httpClient downloadImage:coverUrl]; // 4 dispatch_sync(dispatch_get_main_queue(), ^{ imageView.image = [persistencyManager saveImage:image filename:[coverUrl lastPathComponent]]; }); }); } }
具体解释上面代码
1:downloadImage 被执行通过通知因此接收这个通知对象作为参数:
2:如果之前已经下载图片那么从PersistencyManager 检索图片。
3:如果图片没有下载,那么再次用HTTPClient请求图片
4:当下载完成了在UIImageView里面显示图片并且用PersistencyManager 来保存图片。
我们再次用外观设计模式隐藏从一些类里面下载一个图片的复杂性。这个通知发送者不关心你的图片是从网络获取的还是从文件系统获得的。
编译运行你的应用看看你的专辑已经覆盖到你的滑动视图上。
再次停止并且运行他。注意没有延迟加载你的专辑因为他们已经保存到本地。你甚至可以断开网络链接你的应用还可以继续的完美运行着。但是你的网络提示器一直的旋转不停止了为什么呢?
当你开始下载图片,你没有实现当图片下载完停止网络提示器的旋转的逻辑。你不能每次都发送一个通知当图片下载完成了。然而我们可以用另一个观察者设计模式键值编码。
阅读(...) 评论()我添加了多个观察者,在dealloc里移除掉,移除一次就行么_百度知道
我添加了多个观察者,在dealloc里移除掉,移除一次就行么
提问者采纳
一个观察者就是一个对象吧。你移除一次应该不行吧,小白的见解。
其他类似问题
为您推荐:
观察者的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁IOS面试攻略(1.0)&&
20:58:09|&&分类:&&
ios面试攻略(1.1)&&
20:27:37|&&分类:&&
1.Object-c的类可以多重继承么?可以实现多个接口么??
没有,protocol& 代替,Object-c的类不可以多重继承。2.#import 跟#include 又什么区别,@class呢;&#import&& 跟 #import&"又什么区别??&
#import 能防止重复引用,#include 不能,@class 前置声明一个类。3.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用 ?4、为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?
防止循环引用。
5、定义属性时,什么情况使用copy、assign、retain??
copy:拷贝对象。assign:传值,一般用于基础类型。retain:传地址,引用计数器加一。6,委托是什么?委托的property声明用什么属性?为什么?代理的目的是改变或传递控制链,允许一个类在某些特定时刻通知到其他类而不需要获取那些类的指针。7,类别的作用?1),将类的实现分散到多个类中2),创建对私有方法的引用3),可以添加或修改方法,属性8,.id 声明的对象有什么特性??
可以是任意类型的对象,是个很重要的类型,是个可以指向任何类型的指针或者可以理解为指向任何未知类型的指针。9,.MVC是什么?有什么特性?为什么在iPhone上被广泛运用?MVC设计模式是三种对象:模型对象,视图对象和控制器对象。模型对象代表应用程序的数据和定义操作数据的逻辑。视图对象显示应用程序的模型数据。控制器对象是协调视图和模型对象。
10,对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别是什么类型的对象?
11.什么是安全释放?
12,为什么有些4.0独有的objective-c 函数在3.1上运行时会报错.而4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?13,为什么4.0独有的c函数在3.1的机器上运行不会报错(在没有调用的情况下?)而4.0独有的类名在3.1的机器上一运行就报错??14,常见的object-c的数据类型有那些, 和 c 的 基本数据类型有什么区别?如:nsinteger 和int15,.property中属性retain,copy,assgin的含义分别是什么?有什么区别?将其转换成get/set方法怎么做?有什么注意事项?
16、什么是Notification?&Notification是一种消息,它传递给一个或多个观察对象用来通知它们程序里发生了一个事件。
17、什么时候用delegate,什么时候用Notification?当处理单个需要在另外类触发当前类行为的事件时用代理,多个事件用 Notification.
18、线程理解,有什么好处?线程创建和启动,NSThread& detachNew创建和NSThread 创建两中方式线程共享同一应用程序的部分内存空间它们拥有对数据相同的访问权限19.线程和进程的区别和联系?线程和进程都是程序运行的基本单元,区别在于进程在运行中拥有独立的内存单元,而多个线程共享内存,提高程序效率,线程不能独立执行。20,线程是什么? 有哪些注意事项.?21,.notification是同步还是异步? kvo是同步还是异步?notification是全进程空间的通知吗?22.浅拷贝和深拷贝区别是什么?&浅复制:只复制指向对象的指针,而不复制引用对象本身。深复制:复制引用对象本身。
23,.NSString 和 NSMutableString 有什么区别?24.for(int index = 0; index & 20; index ++){?&&& NSString *tempStr = @&tempStr&;?&&& NSLog(tempStr);?&&& NSNumber *tempNumber = [NSNumber numberWithInt:2];?&&& NSLog(tempNumber);?}?这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?25,.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?26,.在一个对象释放前.如果他被加到了notificationCenter 中.不在notificationcenter中remove这个对象可能会出现什么问题?27,.怎样实现一个 singleton的类.给出思路。单例是在程序生命周期里只被实例化过一次的 类
28.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?.29.在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么?30,.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等.31,ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?32.阐述一个nil对象从interface bulider产生,到载入程序运行空间,最后被释放时所经历的生命周期.33,响应者链是什么?34,.timer的间隔周期准吗?为什么?怎样实现一个精准的timer?35.UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?36.C和obj-c 如何混用?37,ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?view为空时调用loadView,加载完成时调用viewDidLoad,释放时调用viewDidUnload.
38.ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?
39.谈谈你对ARC 的认识和理解?代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了,代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性40, Object-C有私有方法吗?私有变量呢??没,有。41、Object-C的内存管理??引用计数器。??
42、对象是什么时候被release的??引用计数器为0.
43、iOS有没有垃圾回收??没。
44、tableView的重用机制??复用标记。
45、ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewController时在这几个函数中应该做什么工作??当view为nil时调用loadView,view完成加载调用viewDidLoad,view释放时调用viewDidUnload.?
46、ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么??内存超过阙值,尝试释放view.
47、列举Cocoa中常见的几种多线程的实现,并谈谈多线程安全的几种解决办法,一般什么地方会用到多线程??NSThread,GCD等。尽量用上层分装好的方法去实现多线程而不是手动调用NSThread。
48、self.跟self什么区别?self.表示对象的属性,self表示对象本身
49、id、nil代表什么??id相当于void*,nil是空对象。
50、ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么??
51、autorelease的对象是在什么时候被release的?自动释放池中所有对象释放完后释放。
52、这段代码有什么问题,如何修改?for (int i = 0; i & someLargeN i++) { ?NSString *string = @&Abc&;?string = [string lowercaseString];?string = [string stringByAppendingString:@"xyz"];?NSLog(@&%@&, string);?}&?53、autorelease和垃圾回收机制(gc)有什么关系?&内存释放池提供了一个对象容器,每次对象发送autorelease消息时,对象的引用计数并不真正变化,而是向内存释放池中添加一条记录,记下对象的这 种要求。直到当内存释放池发送drain或release消息时,即当池被销毁前会通知池中的所有对象,全部发送release消息才会真正将引用计数减 少?。?
54、考察对@interface与@propety的理解只用 @ interface声明的变量只能在当前的类中访问,在其他类无法访问,而@ propety声明的变量可以在外部访问。@ propety声明的变量可以打点调用
55、objective-c中的类型转换分为哪几类字符串拼接,强制类型转换
56、多态的理解
Object-C是面向对象的编程语言,它具有面向对象编程的一些特性,封装性,继承性和多态性。不同对象以自己的方式响应相同的消息的能力叫多态。多态的主要好处就是简化了编程接口,
腾讯面试题
1。简述push原理,push的证书和其它的右什么不一样?2。viewcontroller的一些方法的说明viewDidLoad, viewWillDisappear, viewWillAppear方法的 顺序和 作用?3。frame 和 bounds 的 区别 ,bound的大小改变frame 改变吗?4。sqlite中插入特殊字符的方法和接收到处理方法。5。谈谈你对数组和链表认识,还有你是怎么用他们的?6。冒泡算法。7。socket编程简述8。asihttp代码原理 ,异步请求的原理,异步请求最大数目,为什么只能这么多?9。http请求方式?10。uiview的圆角属性设置方法。(m_mainImgView.layer.cornerRadius = 6;m_mainImgView.layer.masksToBounds = YES;)11。 masksToBounds属性的作用。(决定子layer是否被当前layer的边界剪切。默认是NO。)
阅读(203)|&评论(
ios面试攻略(2.1)&&
15:53:54|&&分类:&&
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
14.列举几种进程的同步机制,并比较其优缺点。
答案:&&原子操作 信号量机制&&&&自旋锁&&&&管程,会合,分布式系统
&进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
&进程死锁的原因
答案:资源竞争及进程推进顺序非法
&死锁的4个必要条件
答案:互斥、请求保持、不可剥夺、环路
&死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
15.堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
&栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
&堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
16.什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找&它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。
For example, the key path address.streetwould get the value of the address property from the receiving
object, and then determine the street property relative to the address object.
17.c和obj-c如何混用
1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj-c的代码,因为cpp只是cpp
&2)&在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
&3)在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的。
&如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。
&如果模块以函数实现,那么头文件要按c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。
总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp.
18.目标-动作机制
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)
&的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
19.cocoa touch框架
iPhoneOS应用程序的基础&Cocoa Touch&框架重用了许多&Mac&系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit&为您提供了在&iPhone&OS&上实现图形,事件驱动程序的基本工具,其建立在和&Mac OS X&中一样的&Foundation&框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch具有和&iPhone&用户接口一致的特殊设计。有了&UIKit,您可以使用&iPhone&OS&上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了&UIKit&外,Cocoa Touch&包含了创建世界一流&iPhone&应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问&API&以控制摄像头,或通过&GPS&获知当前位置。Cocoa Touch&既包含只需要几行代码就可以完成全部任务的强大的&Objective-C&框架,也在需要时提供基础的&C&语言&API&来直接访问系统。这些框架包括:
Core Animation
通过&Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是&Cocoa Touch&中一小部分可用的框架:
音频和视频
Core Audio
Media Library
AV Foundation
图形和动画
Core Animation
BSD Sockets
Address Book
Core Location
20.objc的内存管理
&如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new&时也同样适用。
如果您拷贝一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放。
如果您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。反过来,
如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该释放它(这个规则有少数的例外,在参考文档中有显式的说明)。
21.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
1.&&ojc-c是通过一种"referring counting"(引用计数)的方式来管理内存的,&对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,&每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,&就会被系统销毁.
&2. NSAutoreleasePool&就是用来做引用计数的管理工作的,这个东西一般不用你管的.
&3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
22.类工厂方法是什么
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。这些方法的形式是+ (type)className...(其中&className不包括任何前缀)。工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对象的分配信息。类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽然init...方法可以确认一 个类在每次程序运行过程只存在一个实例,但它需要首先分配一个&生的&实例,然后还必须释放该实例。工厂方法则可以避免为可能没有用的对象盲目分配内存。
23.单件实例是什么
Foundation和&Application Kit&框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager&和NSWorkspace&类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。
24.动态绑定
&在运行时确定要调用的方法
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C&代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。
25.obj-c的优缺点
objc优点:
&&&1) Cateogies
&&&2) Posing
&&&3)&动态识别
&&&4)&指标计算
&&&5)弹性讯息传递
&&&6)&不是一个过度复杂的&C&衍生语言
&&&7) Objective-C&与&C++&可混合编程
&&&1)&不支援命名空间
&&&2)&&不支持运算符重载
&&3) 不支持多重继承
&&4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
26.sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst, const char* src, unsigned int len);
将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。
sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。
27.用变量a给出下面的定义&
a)一个整型数(An integer)&
&b)一个指向整型数的指针(&A pointer to an integer)&
&c)一个指向指针的的指针,它指向的指针是指向一个整型数(&A pointer to a pointer to an intege)r&
&d)一个有10个整型数的数组(&An array of 10 integers)&
&e)&一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)&
&f)&一个指向有10个整型数数组的指针(&A pointer to an array of 10 integers)&
&g)&一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument&&and returns an integer)&
&h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(&An array of ten pointers to functions t
&hat take an integer argument and return an integer&)&
&a) // An integer&
&b) int *a; // A pointer to an integer&
&c) int **a; // A pointer to a pointer to an integer&
&d) int a[10]; // An array of 10 integers&
&e) int *a[10]; // An array of 10 pointers to integers&
&f) int (*a)[10]; // A pointer to an array of 10 integers&
&g) int (*a)(int); // A pointer to a function a that&&takes an integer argument and returns an integer&
&h) int (*a[10])(int); // An array of 10 pointers to functions&&that take an integer argument and return an integer
ios面试攻略(3.1)&&
11:18:15|&&分类:&&
阅读(41)|&评论(
ios面试攻略(3.2)&&
11:19:06|&&分类:&&
阅读(203)|&评论(
阅读(...) 评论()

我要回帖

更多关于 ios 移除观察者 的文章

 

随机推荐