標籤:
property是Objective-C的關鍵詞,與@synthesize配對使用,用來讓編譯好器自動產生與資料成員同名的方法聲明。@synthesize則是用來產生對應聲明方法的實現。
一、@property關鍵字 1、property的文法格式:
@property (參數1,參數2)類型名字;
這裡的參數,主要有以下三種:
(1)setter/getter方法(assign/retain/copy)
(2)讀寫屬性(readwrite/readonly)
(3)atomicity(nonatomic)
2、三種方式的使用
(1)assign/retain/copy 代表賦值的方式
(2)readonly關鍵字代表setter不會被產生, 所以它不可以和 copy/retain/assign組合使用。
(3)atomicity的預設值是atomic,讀取函數為原子操作。
copy/reain/assign 在其中選擇一個來確定屬性的setter如何處理這個屬性。NSObject對象採用這個中方式。
一些特別的Object比如NSSstring使用copy。
assign關鍵字代表setter直接賦值,而不是複製或者保留它。適用於基礎資料型別 (Elementary Data Type),比如NSInteger和CGFloat,或者你並不直接擁有的類型,比如delegates。
3、如何使用@property
/*沒有使用@property的情況定義成員變數*/
#import <UIKit/UIKit.h> @interface ViewController : UIViewController { NSObject *_obj; }
- (void)viewDidLoad;
@end
@implementation ViewController
- (void)viewDidLoad { [super viewDidLoad]; self.obj = nil;、 }
@end
此時編譯器會報錯。
/*使用@property的情況定義成員變數*/
#import <UIKit/UIKit.h> @interface ViewController : UIViewController { NSObject *_obj; } @property (nonatomic,retain) NSObject *obj; @end
編譯能通過,運行,崩潰,提示錯誤 reason: ‘-[ViewController setObj:]: unrecognized selector sent to instance 0x6b6c480
那就是我們沒事實現setter方法。
用@synthesize關鍵字實現getter 和setter。
@implementation ViewController @synthesize obj; - (void)viewDidLoad { [super viewDidLoad]; self.obj = nil; }
運行,程式運行正常。說明setter 起作用了。
4、@property和@synthesize關鍵字 產生的程式碼
#import <UIKit/UIKit.h> @interface ViewController : UIViewController { NSObject *obj; } //@property (nonatomic,retain) NSObject *obj; -(NSObject*)obj;
-(void)setObj:(NSObject*)newObj; @end
@implementation ViewController //@synthesize obj; - (void)viewDidLoad { [super viewDidLoad]; self.obj = nil; } -(NSObject*)obj{ return obj; } -(void)setObj:(NSObject*)newObj{ if(obj != newObj){ [obj release]; obj = [newObj retain]; } }
再運行,也能正常啟動。說明自己寫的getter 和setter替代了property。
5、使用三種參數的對比
@property (nonatomic,retain)NSObject *obj;@property (nonatomic,retain,readwrite) NSObject *obj;
readwrite是預設行為,所以這兩行代碼等價
@property (retain) NSObject *obj;@property (atomic,retain) NSObject *obj;
atomic是預設行為,所以這兩行代碼是等價的。
@property(atomic,assign)int number; @property(atomic) int number; @property int number;
對int 來說,atomic assign都是預設行為,所以這三行是等價的。
@property NSObject *obj;
這樣寫行嗎?不行的,警示告
只有int 等基礎資料類型能這麼寫。對象必須加上賦值的類型。
@property (retain) NSObject *obj;
這樣就沒問題了。何時使用assign、何時使用retain、copy後面再講。
二、@synthesize關鍵字
//// Person.m// 25_Property//// Created by jiangwei on 14-10-12.// Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>#import "User.h"//有時候我們不想定義屬性為_開頭的//這時候我們就可以使用@synthesize,來修改我們想要的屬性名稱//這時候屬性_userName變成了$userName@implementation User@synthesize userName = $userName;@end
因為我們使用@property定義屬性之後,如果我們想修改這個屬性的名稱,就可以使用@synthesize關鍵字來對屬性名稱進行修改
@synthesize userName = $userName;
黑馬程式員--Objective-C之[email protected]和@synthesize關鍵字