iOS开发:iPhone 面试题解答
1.main()
{
inta[5]={};
int *ptr=(int*)( a+1);
printf("%d%d",*(a+1),*(ptr-1));
}
答:25
*(a+1)就是a[1],*(ptr-1)就是a[4]执行结果是2,5
a+1不是首地址+1,编制会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
int *ptr=(int *)( a+1);
则ptr实际 是 (a[5])也就是a+5
原因如下:
a是数组指针,其类型为int (*)[5];
而 指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
a是长度为5的int数组指针,所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与( a+1)类型是不一样的(这点很严重)
所以prt-1只会减去sizeof(int*)
a a的地址是一样的,但意思不一样
a是数组首地址,也就是a[0]的地址, a是对象(数组)首地址,
a+1是数组下一元素的地址,即a[1] a+1是下一个对象的地址,即a[5].
2. 以下为WindowsNT下的32位C++程序,请计算sizeof的值
void Func ( char str[100])
{
sizeof( str ) =?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
这题 很常见了Func (char str[100])函数中数组名作为函数形参时,在函数体内,数组名遗失了本身的内在,仅仅只是一个指针;在遗失其内在的同时,它还遗失了其常量特性,可以作自增、自减等操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str )、sizeof ( p ) 都为4。
3.还是考指针不过我对cocoa的代码还是不太谙习
大概是这样的
- (void)*getNSString(constNSString * inputString)
{
is amaintest\n";
return ;
}
-main(void)
{
NSString";
NSString*aString = [NSStringstringWithString:@"%@"getNSString(a)];
NSLog(@"%@\n"aString);
}
最后问输出的字符串:NULLoutput在函数返回后,内存已经被开释。对比一下iOS开发。
4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(马虎闰年问题)
#define SECONDS_PER_YEAR(60 * 60 * 24 *365)UL
我在这想看到几件事 情:
?; #define语法的基础学问(例如:不能以分号结束,括号的使用,等等)
?;懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
?;意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L告诉编译器这个常数是的长整型数。
?;如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很严重。
写一个"
标准"宏MIN,这个宏输入两个参数并返回较小的一个。
#defineMIN(AB) ((A) <= (B) ? (A) :(B))
这
个测试是为下面的目的而设的:
?;
标识#define在宏中应用的基础学问。这是很严重的,因为直到嵌入(inline)操作符变为标准C的一局部,iphone。宏是方便产生嵌入代码的唯一方
法,
对付嵌入式编制来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
?;
三重条件操作符的学问。这个操作符存在C言语中的原因是它使得编译器能产生比 if-then-else更优化的代码,了解这个用法是很严重的。
?; 懂得在宏中小心地把参数用括号括起来
?; 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
least = MIN(*p++b);
结果是:
((*p++) <= (b) ? (*p++) : (*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
5.写一个委托的interface
@protocolMyDelegate;
@interface MyClass:NSObject
{
id <MyDelegate>delegate;
}
// 委托方法
@protocolMyDelegate
- (void)didJobs:(NSArray*)args;
@end
6.写一个NSString类的完成
+(id)initWithCString:(constchar *)nullTerminatedCStringencoding:(NSStringEncoding)encoding;
+ (id) stringWithCString:(const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString*obj;
obj =[self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString:nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
7.obj-c有多重继承么?不是的话有什么替代方法?
cocoa中所有的类都是NSObject 的子类
多继承在这里是用protocol委托代理 来完成的
你不用去思索繁琐的多继承 虚基类的概念.
ood的多态特性在 obj-c中通过委托来完成.
8.obj-c有私有方法么?私有变量呢
objective-c -类里面的方法唯有两种 静态方法和实例方法. 这似乎就不是完整的面向对象了按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话 对付一些小局限的代码重用就不那么利市了. 在类里面声名一个私有方法
@interface Controller :NSObject { NSString *something; }
+(void)thisIsAStaticMethod;
-(void)thisIsAnInstsome kind ofceMethod;
@end
@interface Controller(private) -
(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的
9.关键字const有什么含意?修饰类呢?static的作用用于类呢?还有extern c的作用
const意味着"只读",下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论:
?;关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果
你曾花很多时间清理其它人留下的渣滓,你就会很快学会感谢这点多余的信息。Windows Mobile。(当然,懂得用const的程序员很少会留下的渣滓让别人来清
理的。)
?;通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
?;合理地使用关键字const可以使编译器很自然地保护那些不理想被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少insect的出现。
(1)欲阻止一个变量被改变,可以使用 const关键字。在定义该 const 变量时,通常须要对它进行初
始化,因为以后就没无机会再去改变它了;
(2)对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指
定为 const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数外部不能改变其值;
(4)对付类的成员函数,若指定其为 const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对付类的成员函数,有时期必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到
这个变量时必须每次都小心地重新读取这个变量的值,面试题解答。而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
?;并行设备的硬件寄存器(如:状态寄存器)
?; 一个中断服务子程序中会访问到的非主动变量(Non-automaticvariables)
?; 多线程应用中被几个任务共享的变量
?;一个参数既可以是const还可以是volatile吗?解释为什么。
?; 一个指针可以是volatile吗?解释为什么。
下 面是答案:
?;是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
?;是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个drink stationrier的指针时。
static关键字的作用:
(1)函数体内 static变量的作用局限为该函数体,不同于 auto 变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
(2)在模块内的 static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用局限被限制在声明
它的模块内;
(4)在类中的 static成员变量属于整个类所拥有,对类的所有对象唯有一份拷贝;
(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static成员变量。
extern "C"的作用
(1)被 extern "C"限定的函数或变量是extern 类型的;
extern 是C/C++言语中表明函数和全局变量作用局限(可见性)的关键字,该关键字告诉编译器,
其声明的函数和变量可以在本模块或 其它模块中使用。
(2)被 extern "C"修饰的变量和函数是按照C 言语方式编译和连接的;
extern"C"的惯用法
(1)在 C++中引用 C言语中的函数和变量,在包括 C 言语头文件(假设为 cExamplifierle.h)时,需进
行下列处理:
extern "C"
{
#include "cExamplifierle.h"
}
而在 C 言语的头文件中,对其外部函数只能指定为 extern 类型,C 言语中不接济 extern "C"声明,
在.c 文件中包括了 extern "C"时会出现编译语法错误。其他手机开发。
(2)在 C 中引用C++言语中的函数和变量时,C++的头文件需添加 extern "C",但是在 C 言语中不
能直接引用声明了 extern "C"的该头文件,应该仅将 C 文件中将 C++中定义的 extern"C"函数声明为
extern 类型。
10.为什么标准头文件都有类似以下的布局?
#ifndef__INCvxWorksh
#define__INCvxWorksh
#ifdef__cplusplus
extern "C"{
#endif
#ifdef__cplusplus
}
#endif
#endif
显然,头文件中的编译宏“#ifndef__INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止该头文件被重复引用。
11.#import跟#include的区别@class呢?
@class一般用于头文件中须要声明该类的某个实例变量的时期用到,在m文件中还是须要使用#import
而#import比起#include的好处就是不会引起交叉编译
12.MVC模式的理解
MVC设计模式思索三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的学问和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制器对象是应用程序的视图对象和模型对象之间的调解者。
13.线程与进程的区别和联系?
进程和线程都是由操作编制所体会的程序运转的基础单元,编制使用该基础单元完成编制对应用的并发性。
程和线程的主要差别在于它们是不同的操作编制资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行途径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。你看Windows Mobile,Windows Mobil。但对付一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
14.列举几种进程的同步机制,并比较其优缺点。你知道面试题。
答案:原子操作信号量机制自旋锁管程,会合,分布式编制
进程之间通信的途径
答案:共享存储编制消息传递编制管道:以文件编制为基础
进 程死锁的原因
答案:资源竞争及进程推进秩序作歹
死锁的4个必要条 件
答案:互斥、请求保持、不可剥夺、环路
死锁的处理
答案:鸵鸟策略、预防策略、制止策略、检测与解除死锁
15.堆和栈的区别
管理方式:对付栈来讲,是由编译器主动管理,无需我们手工控制;对付堆来说,开释劳动由程序员控制,容易产生memory leak。
申请大小:
栈:在Windows下栈是向低地址扩展的数据布局,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是编制预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),其他手机开发。如果申请的空间突出栈的糟粕空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据布局,是不连续的内存区域。这是由于编制是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机编制中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对付堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对付栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行开释,对于Android开发。无需我们手工完成。
分配效率:栈是机器编制提供的数据布局,计算机会在底层对栈提供接济:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很纷乱的。
16.什么是键-值键途径是什么
模型的本质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键途径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象本质序列。第一个键的
本质是由先前的本质决定的,接下来每个键的值也是绝对付其前面的本质。键途径使您可以以独立于模型
完成的方式指定相关 对象的本质。通过键途径,您可以指定对象图中的一个任意深度的途径,使其指向相
关对象的特定属性。
For examplifierle the key pathpostingdress.streetwould get the value of the postingdress property from thereceiving
object as well asn determine thestreet property relative to the postingdress object.
17.c和obj-c如何混用
1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-ccc++代码,但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的东西,包括#importcocoa的。面试题解答。完成文件中,即类的完成代码中可以使用obj-c的东西,可以import只是后缀是mm。
如果模块以函数完成,那么头文件要按c的格式声明函数,完成文件中,c++函数外部可以用obj-c,但后缀还是mm或m。
总结:只要cpp文件和cppinclude的文件中不包括obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,iOS开发。而不能直接使用完成代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器接济cpp.
18.目标-动作机制
目标是动作消息的接收者。一个控件,其他手机开发。或者更为常见的是它的单元,以插座变量(参见"插座变量"局部)
的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而完成的方法。
程序须要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
19.cocoa touch框架
iPhone OS 应用程序的基础 CocoaTouch 框架重用了许多 Mac 编制的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS上完成图形,事件驱动程序的基础工具,其建立在和 Mac OS X 中一样的 Foundation框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS上的独特的图形接口控件,按钮,以及全屏视图的效用,您还可以使用加快仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,CocoaTouch 包括了创建世界一流 iPhone 应用程序须要的所有框架,从三维图形,到专业音效,听听开发。以至提供设备访问 API以控制摄像头,或通过 GPS 获知当前位置。Cocoa Touch 既包括只须要几行代码就可以完成全部任务的强大的Objective-C 框架,也在须要时提供基础的 C 言语 API 来直接访问编制。这些框架包括:
Core Animation
通过 CoreAnimation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio是播放,你知道ios。处理和录制音频的专业技术,
com的人员
能够轻松为您的应用程序添加强大的音频效用。
Core Data
提供了一个面向对象的数据管理解决计划,它易于使用和理解,以至可处理任何应用或大或小的数据模型。
效用列表:框架分类
下面是 Cocoa Touch 中一小局部可用的框架:
音频和视频
Core Audio
OpenAL
Media Libreast supportry
AV Foundation
数据管理
Core Data
SQLite
图形和动画
Core Animation
OpenGL ES
Quartz 2D
网络/li>
Bonjour
WebKit
BSD Sockets
用户应用
Address Book
Core Location
Map Kit
Store Kit
20.objc的内存管理
?如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,Windows Phone。您就拥
有这个对象,须要负责该对象的开释。这个规则在使用NSObject的便利方法new时也同样适用。
?如果您拷贝一个对象,您也拥有拷贝得到的对象,事实上Windows Phone。须要负责该对象的开释。
?如果您保持一个对象,您就局部拥有这个对象,须要在不再使用时开释该对象。
反过去,
?如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该开释它(这个规则有少数
的例外,在参考文档中有显式的说明)。
21.主动开释池是什么如何劳动
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的主动开释池。它仍然是个正当的对象,因此主动开释池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,主动开释池就会被开释,池中的所有对象也就被开释。
1.ojc-c是通过一种"referring counting"(引用计数)的方式来管理内存的对象在开始分配内存(alloc)的时期引用计数为一以后每当碰到有copyretain的时期引用计数都会加一每当碰到release和autorelease的时期引用计数就会减一如果此对象的计数变为了0 就会被编制销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理劳动的这个东西一般不用你管的.
3.autorelease和release没什么区别只是引用计数减一的时机不同而已autorelease会在对象的使用真正结束的时期才做引用计数减一.
22.类工厂方法是什么
类工厂方法的完成是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并
进行主动开释处理。这些方法的形式是+ (type)className...(其中className不包括任何前缀)。
工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对
象的分配信息。
类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽然init...方法可以确认一
个类在每次程序运转过程只存在一个实例,但它须要首先分配一个“生的”实例,然后还必须开释该实例。你看解答。
工厂 方法则可以制止为可能没有用的对象盲目分配内存。
23.单件实例是什么
Foundation 和 ApplicationKit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileMsome kind ofager和NSWorkspace类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时期,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。 单件对象充当控制中心的角色,负责指引或调解类的各种服务。如果类在概念上唯有一个实例(比如
NSWorkspace),就应该产生 一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可
以使用单件实例机制,而不是工厂方法或函数。
24.动态绑定
—在运转时确定要调用的方法
动态绑定将调用方法的确定也推迟到运转时。在编译时,方法的调用并不和代码绑定在一起,唯有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运转时因子负责确定消息的接收者和被调用的方法。运转时的消息分发机制为动态绑定提供接济。当您向一个动态类型确定了的对象发送消息时,运转环境编制会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C代码中做任何劳动,就可以主动获取动态绑定的好处。您在每次发送消息时,
特别是当消息的接收者是动态类型已经确定的对象时,你知道iOS开发。动态绑定就会例行而透明地发生。
25.obj-c的优缺点
objc优点:
1)Cateogies
2)Posing
3) 动态识别
4)指标计算
5)弹性讯息传递
6) 不是一个过度纷乱的 C 衍生言语
7) Objective-C 与 C++可混合编程
缺点:
1)不支援命名空間
2)不接济运算符重载
3)不接济多重继承
4)使用动态运转时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。iPhone。(如内联函数等),性能低劣。
26.sprintfstrcpymemcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char*dst const char *src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝效用的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst const char* src unsigned intlen);
将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。
sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,Android开发。造成溢出。
27. 用变量a给出下面的定义
a) 一个整型数(Aninteger)
b)一 个指向整型数的指针( A pointer to some kind ofinteger)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to some kind ofintege)r
d)一个有10个整型数的数组( An assortment of 10integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An assortment of 10 pointers tointegers)
f) 一个指向有10个整型数数组的指针( A pointer to some kind of assortment of 10integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takessome kind of integer as some kind of argument
some kind ofd returns some kind ofinteger)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An assortment of tenpointers to functions t
hat take some kind of integer argument some kind ofd return some kind of integer)
答 案是:
a) int a; // Aninteger
b) int *a; // A pointer to some kind ofinteger
c) int **a; // A pointer to a pointer to some kind ofinteger
d) int a[10]; // An assortment of 10integers
e) int *a[10]; // An assortment of 10 pointers tointegers
f) int (*a)[10]; // A pointer to some kind of assortment of 10integers
g) int (*a)(int); // A pointer to a function athattakes some kind of integer argument some kind ofd returns some kind ofinteger
h) int (*a[10])(int); // An assortment of 10 pointers tofunctionsthat take some kind of integer argument some kind ofdreturn some kind of integer
28.repostingwrite,repostingonly,assign,retain,copy,nonatomic属性的作用
@property是一个属性访问声明,扩号内接济以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,repostingwriterepostingonly,设置可供访问级别
2,assign,看看iOS开发。setter方法直接赋值,不进行 任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有完成都是这个秩序(CC上有相关原料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
@synthesizexxx;来完成实际代码
*********************************
1Objective-C外部的完成2CALayer和View的关系3 http协议,tcp/ip4 UITableView的那些元素是可以自定义的?5 c言语的,定义变量,比如int,在什么情况下,其最大值是不同的6 比较32位平台和64位平台不同7 iphone app为什么会被打回来,如何制止??8 为啥离开团队?
1.针对第一个问题,可以看看下面的教程
Object c研究的比较深入的教程
第6章写的加倍好
KVO/KVC完成机理分析
2.CALayer和View的关系
一个UIView包括CALayer树,CALayer是一个数据模型,听说iPhone。包括了一些用于显示的对象,但本身不用于显示。
CALayer相当于photoshop的一个层,很多动画可以通过设置CALayer来完成。据说有人用CALayer显示图片来播放视频。
Coresome kind ofimation应该是用CAlayer来完成各种动画。
这里有篇博文,介绍的还可以
1.objc是扩充C的面向对象,开发mac osx的编程语言。
2.objc中的减号与加号
①减号表示一个函数、或者方法或者消息的开始(在一个类的实例上被调用和实施)
②加号表示其他的函数可以直接调用这个类中的方法,而不用创建这个类的实例
3.NS开发包
乔布斯的NextStep公司缩写,现今mac os使用NS这套函数库
4.#import作用如同#include,用于声明头文件。
5.nil表示空指针,相当于java的null
6.objc中使用字符串,前面要加上"@",是因为在前面加上"符号",编译器在编译的时候会在程序中给你留出位置,这样才能保证这个字符串不会丢失。(@是把C的字符串转成NSString的一个简写)
7.开发objc类,需要创建一个头文件和一个实现文件
①头文件(.h):包含类的实例变量的名称和类型、描述方法参数和返回值类型的方法签名;
②实现文件(.m):包含这些方法的实现代码,以及对别的类不可见的,仅与实现本身相关的局部变量的声明和使用。
8.九宫格解法原理;(右上解法)
左出右写入、右出左写入、上出下写入、下出上写入、重排置下;
9.iphone应用程序的项目基本结构
classes:里面存放object-c类源代码文件(可以创建子文件夹来组织代码);
other sources:存放除objective-c类之外的源代码文件;
resources: 包含应用程序中的非代码文件(因为应用程序只能在自己的沙盒中运行,不然找不到);
Frameworks:特殊的库,可以存放库、框架、图像、声音等资源;
Products:包含项目在编译时生成的应用程序(xxx.app);
10.Info.plist文件里的bundle identifier(束标识符)
它是应用程序的唯一标识符,要始终配置,命名格式为:顶级Internet域+.+公司名称+.+应用名称;
11.一个在代码里对nib中对象(UILabel、UITextField等)的引用被称为一个插座变量(outlet),用关键字IBOutlet标明(在头文件里);能够被nib中对象调用的方法称为动作(action),用关键字IBAction标明(在实现文件里)。
12.在实现某个动作或是对象后要对这个动作或是对象后要使用release释放内存。
13.IBOutlet
输出口 使用关键字IBOutlet来声明实例变量,并通过这个实例变量来引用nib中的对象;
14.-(IBAction)doSomething:(id)sender
控制某个对象执行某项动作 通过关键字IBAction来声明,通过IBAction告诉interface Builder,此方法是一个操作,且可以被某个控件触发;通常 这个操作接受一个参数,该参数被定义为id,名称被指定为sender.(当需要传参数的时候就通过sender来传递,当不需要传参数的时候sender可以不写的);
15.@property (retain , nonatomic) UILable textArea;
retain是通知编译器向分配给此属性的对象发送一个保留(retain)消息,确保属性的实例变量在被使用过程中不会被从内存中删除;
nonatomic是 创建一个互斥访问,避免读和写不同步(非原子性访问);
通过这个属性声明访问来提高执行的效率;(原子性好比如我们去银行存钱,存进去的时候银行账户就会同时增加相应的数额,有一面失败就都回到原来的状态);
16.内存管理理解
①:程序A里有一段内存被成功申请完成之后,内存计数器就从0变为1
(这个过程是alloc);
②:然后程序B里也要使用这个内存,那么内存计数器从1变为2
(这个过程是retain);
③:紧接着程序A不需要这个内存了,那么程序A就把这个内存计数器减1
(这个过程是release);
④:当系统发现这个内存计数器变为0,那么就调用内存回收程序把这段内存回收(这个过程是dealloc);
17.objc使用消息机制来调用方法,消息就是一个类或者对象可以执行的动作
消息表达式:[对象或者类名字 方法名字:参数序列];
对象或者类名字:接收器,是消息的接收者;
方法名字:参数序列:要发送的消息(要执行的动作);
转载于:https://www.cnblogs.com/greywolf/archive/2012/11/22/2781868.html