[iOS-Objective-C] @property

2016-04-02  本文已影响275人  水止云起

概念

@property@synthesize都是编译器指令,在源文件被编译时,会被替换为相应的代码。@property提供了一种封装对象数据的方法。@property被声明在类的接口中:

@interface XYZPerson : NSObject
    
@property NSString *firstName;
@property NSString *lastName;
    
@end

或者私有的接口扩展中

@interface XYZPerson ()

@property NSString *firstName;
@property NSString *lastName;
    
@end

编译器会默认自动生成get和set方法,get方法和@property同名,set方法则是set加property名首字母大写。编译器还会默认生成一个成员变量,命名为property名前加下划线,set和get方法操作的就是这个变量。可以通过@synthesize修改默认的变量名,如:

@synthesize firstName = ivar_firstName;

如果不重新指定变量名,则变量会与property同名,如:

@synthesize firstName;

可以自定义实现property的存取方法,如果存取方法都实现了的话,则编译器默认不会再生成成员变量。在Xcode4.4之前,必须在implementation中声明@synthesize编译器才会实现相应存取方法。

属性

可以在@property后加一对括号,里面可以定义一些property的属性。属性告诉编译器如何生成相应的访问方法。

// MRC
NSString *str = [[[NSString alloc] initWithFormat:@""] autorelease]; 
// ARC
NSString *__autoreleasing str = [[NSString alloc] initWithFormat:@"hehe"]; 

__autorelease主要用在参数传递返回值和引用(id *)传递参数的情况,比如iOS中常用的传递NSError指针的情况

-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;

因为默认NSError *error声明的是__strong的引用,所以编译器会默认进行转换

NSError * __strong error;
NSError * __autoreleasing tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
if (!OK) {
    // Report the error.
}

所以在声明时,我们可以直接将error变量声明为__autoreleasing。

上一篇 下一篇

猜你喜欢

热点阅读