1.Foundation和Core Foundation对象有什么区别?
Foundation对象是Objective-C对象,而Core Foundation对象是C对象,二者比较相似,Foundation下的类基本都是NS开头,Core Foundation下的类基本是CF开头的。
这里说一下两者在iOS中的内存管理问题,以前在MRC情况下,都是开发人员手动管理对象内存,二者区别不大。但在ARC情况下,由于Foundation框架是OC对象,所以由系统自动管理内存,而Core Foundation框架是C对象,所以需要开发人员手动管理内存,不然会引起内存泄露。
在ARC下,可以对两个框架的类进行相互转换,以NSString为例,有与之对应的CFStringRef,两者之间可以通过__bridge、__bridge_transfer、__bridge_retained转换:
__bridge:用于NSString与CFStringRef相互转换,不改变对象的管理权所有者,按照本来对象的内存管理。本来是NSString,转换为CFStringRef类型,依旧由系统管理;本来是CFStringRef,转换为NSString,由开发人员管理。
//ARC管理Foundation对象
NSString * s1=@"string";
//转换后依然由ARC管理释放
CFStringRef cfstring=(__bridge CFStringRef)s1;
//开发者手动管理Core Foundation对象
CFStringRef cfstring2=CFStringCreateWithCString(NULL, "string",kCFStringEncodingASCII);
//转换后仍然需要手动管理内存对象
NSString * s2=(__bridge NSString*)cfstring2;
__bridge_transfer:用于CFStringRef转换成NSString,进行管理权移交,由系统自动管理。
//开发者手动管理Core Foundation对象
CFStringRef cfstring=CFStringCreateWithCString(NULL, "string",kCFStringEncodingASCII);
//转换后由ARC管理对象释放,不用担心内存释放
NSString * s=(__bridge_transfer NSString*)cfstring;
__bridge_retained:用于NSString转换成CFStringRef,剥夺了ARC管理权,需要开发人员手动管理。
//ARC管理Foundation对象
NSString * s=@"string";
//转换后不由ARC管理释放。需手动释放
CFStringRef cfstring=(__bridge_retained CFStringRef)s;
2.属性和成员变量有什么区别?
属性包括成员变量(_成员变量名)和它的setter,getter方法。成员变量对外界是私有的,属性对外界是公共的。
@interface Person : NSObject
{
//成员变量
NSString* age;
}
//属性
@property(nonatomic,copy)NSString * name;
-(void)test;
@end
@implementation Person
-(void)test
{
age=@"10";
NSLog(@"%@",age);
_name=@"ZS";
NSLog(@"%@ %@",self.name,_name);
self.name=@"LL";
NSLog(@"%@ %@",self.name,_name);
}
@end