1.main()c++
{ 程序员
int a[5]={1,2,3,4,5}; objective-c
int *ptr=(int *)(&a+1); 编程
printf("%d,%d",*(a+1),*(ptr-1));设计模式
}数组
答:2,5网络
*(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. 如下为Windows NT下的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(const NSString * inputString)
{
inputString = @"This is a main test\n";
return ;
}
-main(void)
{
NSString *a=@"Main";
NSString *aString = [NSString stringWithString:@"%@",getNSString(a)];
NSLog(@"%@\n", aString);
}
最后问输出的字符串:NULL,output在 函数返回后,内存已经被释放。
4.用预处理指令#define声明一个常数,用以代表1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
?; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
?; 懂得预处理器将为你计算常数表达式的值,所以,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
?; 意识到这个表达式将使一个16位机的整型数溢出-所以要用到长整型符号L,告诉编译器这个常数是的长整型数。
?; 若是你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。
写一个" 标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的:
?; 标识#define在宏中应用的基本知识。这是很重要的,由于直到嵌入(inline)操做符变为标准C的一部分,宏是方便产生嵌入代码的惟一方 法, 对于嵌入式系统来讲,为了能达到要求的性能,嵌入代码常常是必须的方法。
?;三重条件操做符的知识。这个操做符存在C语言中的缘由是它使得编译器能产生比 if-then-else 更优化的代码,了解这个用法是很重要的。
?; 懂得在宏中当心地把参数用括号括起来
?; 我也用这个问题开始讨论宏的反作用,例如:当你写下面的代码时会发生什事?
least = MIN(*p++, b);
结果是: ((*p++) <= (b) ? (*p++) : (*p++)) 这个表达式会产生反作用,指针p会做三次++自增操做。
5.写一个委托的 interface
@protocol MyDelegate;
@interface MyClass: NSObject
{
id <MyDelegate> delegate;
}
// 委托方法
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
6. 写一个NSString类的实现
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(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)thisIsAnInstanceMethod;
@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的做用是为给读你代码的人传达很是有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。若是 你曾花不少 时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(固然,懂得用const的程序员不多会留下的垃圾让别人来清 理的。) ?; 经过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 ?; 合理地使用关键字const可使编译器很天然地保护那些不但愿被改变的参数,防止其被无心的代码修改。简而言之,这样能够减小bug的出现。
(1)欲阻止一个变量被改变,可使用 const 关键字。在定义该 const 变量时,一般须要对它进行初 始化,由于之后就没有机会再去改变它了; (2)对指针来讲,能够指定指针自己为 const,也能够指定指针所指的数据为 const,或两者同时指 定为 const; (3)在一个函数声明中,const 能够修饰形参,代表它是一个输入参数,在函数内部不能改变其值; (4)对于类的成员函数,若指定其为 const 类型,则代表其是一个常函数,不能修改类的成员变量; (5)对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
关键字volatile有什么含意?并给出三个不一样的例子。
一个定义为 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到 这个变量时必须 每次都当心地从新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
?; 并行设备的硬件寄存器(如:状态寄存器) ?; 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) ?; 多线程应用中被几个任务共享的变量 ?; 一个参数既能够是const还能够是volatile吗?解释为何。 ?; 一个指针能够是volatile 吗?解释为何。 下 面是答案: ?; 是的。一个例子是只读的状态寄存器。它是volatile由于它可能被意想不到地改变。它是const由于程序不该该试图去修改它。 ?; 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
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 语言头文件(假设为 cExample.h)时,需进 行下列处理: extern "C" { #include "cExample.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 /* __INCvxWorksh */
显然,头文件中的编译宏 “#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的做用 是防止该头文件被重复引用。
11.#import 跟#include的区别,@class呢?
@class通常用于头文件中须要声明该类的某个实例变量的时候用到,在m文 件中仍是须要使用#import
而#import比 起#include的好处就是不会引发交叉编译
12.MVC 模式的理解
MVC设计模式考虑三种对 象:模型对象、视图对象、和控制器对象。模型对象表明 特别的知识和专业技能,它们负责保有应用程序的数据和定义操做数据的逻辑。视图对象知道如何显示应用程序的模型数据,并且可能容许用户对其进行编辑。控制 器对象是应用程序的视图对象和模型对象之间的协调者。
13. 线程与进程的区别和联系?
进程和线程都是由操做系统所体会的程序运行的基本 单元,系统利用该基本单元实现系统对应用的并发性。
程和线程的主要差异在于它们是不一样的操做系统资源 管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。
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框架
iPhone OS 应用程序的基础 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 是播放,处理和录制音频的专业技术,可以轻松为您的应用程序添增强大的音频功能。
Core Data
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用 或大或小的数据模型。
功能列表:框架分类
下面是 Cocoa Touch 中一小部分可用的框架:
音频和 视频Core AudioOpenALMedia LibraryAV Foundation数据管理Core DataSQLite
图 形和动画Core AnimationOpenGL ESQuartz 2D网络/li>BonjourWebKitBSD Sockets
用 户应用Address BookCore LocationMap KitStore Kit
20.objc的内存管理
? 若是您经过分配和初始化(好比[[MyClass alloc] init])的方式来建立对象,您就拥有这个对象,须要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也一样适用。 ? 若是您拷贝一个对象,您也拥有拷贝获得的对象,须要负责该对象的释放。? 若是您保持一个对象,您就部分拥有这个对象,须要在再也不使用时释放该对象。 反过来 ? 若是您从其它对象那里接收到一个对象,则您不拥有该对象,也不该该释放它(这个规则有少数 的例外,在参考文档中有显式的说明)。
内存管理理解
(1)程序A里有一段内存被成功申请完成以后,内存计数器就从0变成1(这个过程是alloc)
(2)而后程序B里也要使用这个内存,那么内存计数器从1变成2(这个过程是retain)
(3)紧接着程序A不须要这个内存了,那么程序A就把这个内存计数器减1(这个过程是release)
(4)当系统发现这个内存计数器变为0,那么就调用内存回收程序把这段内存回收(这个过程是dealloc)
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) int 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
28.readwrite,readonly,assign,retain,copy,nonatomic属性的做用
@property是 一个属性访问声明,扩号内支持如下几个属性: 1,getter=getterName,setter=setterName,设置setter与 getter的方法名 2,readwrite,readonly,设置可供访问级别 2,assign,setter方法直接赋值,不进行 任何retain操做,为了解决原类型与环循引用问题 3,retain,setter方法对参数进行release旧值再retain新值,全部 实现都是这个顺序(CC上有相关资料) 4,copy,setter方法进行Copy操做,与retain处理流程同样,先旧值release,再 Copy出新的对象,retainCount为1。这是为了减小对上下文的依赖而引入的机制。 5,nonatomic,非原子性访问,不加同步, 多线程并发访问会提升性能。注意,若是不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
@synthesize xxx; 来实现实际代码