Objective-C语言特性

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

你可能感兴趣的:(Objective-C语言特性)