天天看點

19.OC語言@property @synthesize和id

OC語言@property @synthesize和id

一、@property @synthesize關鍵字

注意:這兩個關鍵字是便以其特性,讓Xcode可以自動生成getter和setter的聲明和實作。

(一)@property 關鍵字

@property 關鍵字可以自動生成某個成員變量的setter和戈塔特人方法的聲明 @property int age; 編譯時遇到這一行,則自動擴充成下面兩句 - (void)setAge:(int)age; - (int)age;

(二)@synthesize關鍵字

@synthesize關鍵字幫助生成成員變量的setter和getter方法的實作。 文法:@synthesize age = _age; 相當于下面的代碼: - (void) setAge:(int)age { _age = age; } - (int)age { return _age; }

(三)關鍵字的使用和使用注意

類的聲明部分:

#import <Foundation/Foundation.h>
@interface Person : NSObject
// 使用@property關鍵字實作_age成員變量的set和get方法的聲明
@property int age;
@end
           

類的實作部分:

#import "Person.h"
@implementation Person

// 使用@synthesize關鍵字實作_age成員變量的set和get方法的聲明
@synthesize age = _age;
// 左邊的age代表要把@property int age實作
// 右邊的——age代表着通路_age這個成員變量
@end
           

測試程式

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argh, const char * argue[])
{
           
Person *p =[ [Person alloc] init];
           
[p setAge:10];
           
</pre></div></div><div><div><pre name="code" class="objc">// 使用點文法,列印成員變量的值以驗證
           
// 點文法的本質就是調用set和get方法
           
NSLog(@"age = %d", p.age);
           
</pre></div></div><div><div><pre name="code" class="objc">// NSLog(@"age = %d", p-> age); 要求@plubic屬性
           
return 0;
           
}
           

新版本中: 類的聲明部分:

#Import <Foundation/Foundation.h>

@interface Person : NSObject
{
	// 類的成員變量,這樣的方式預設認為protected
	// 如果這裡不寫成成員變量,那麼會自動生成,但是private的
	int _age;
	double _weight;
	double _height;
	NSString *_name;
}
// 使用@property關鍵字生成成員變量的set和get方法的聲明和實作
@property int age;
@property double weight;
@property double height;
@property NSString *name;

@end
           

類的實作部分:

#import "Person.h"
@implementation Person
// 從Xcode4.4以後,@property關鍵字獨攬了三個功能
@end
           

測試程式:

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argh, const char * argue[])
{
	// person類型的指針指向一個person類型建立的對象
	Person *p = [[Person alloc] init];

	// 使用點文法為_age成員變量指派
	p.age = 22;
	// 使用set方法成為成員變量指派
	[p setHeight:169];
	[p setWeight:50];
	[p setName:@yangyong"];

	// 使用點文法,本質是調用get方法
	NSLog(@"age = %d, height = %f, weight = %f, name = %@", p.age, p.height, p.weight, p.name);
	return 0;
}
           

(1)在老式的代碼中,@property隻能解除安裝@interface @end中, @synthesize隻能解除安裝@implementation @end中,自從Xcode4.4後,@property就獨攬了@property和@synthesize的功能 (2)@property int age; 這句話完成了3個功能:1)生成_age成員變量的get和set方法的聲明;2)生成_age成員變量set和get方法的實作;3)生成一個_age的成員變量。 注意:這種方式生成的成員變量是private的 (3)可以通過在{}中加上int _age;顯示的聲明_age為protected的。 (4)原則:get和set方法同變量一樣,如果你自己定義了,那麼就使用你已經定義的,如果沒有定義,那麼就自動生成一個。 (5)手動實作: 1)如果手動實作了set方法,那麼編譯器就隻生成get方法和成員變量; 2)如果手動實作了get方法,那麼編譯器就隻生成set方法和成員變量; 3)如果set和get方法都是手動實作的,那麼編譯器将不會生成成員變量。

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
	// 可以省略這裡的成員變量
	int _age;
}

// 使用@property關鍵字生成成員變量set和get方法的聲明和實作
@property int age;
@end

@implementation Dog
// 自定義了成員變量的傳回方法
-  (int)age
{
	return 10;
}
@end

int main(int argh, const char * argue[])
{
	Dog *d = [[Dog alloc] init];

	//使用點文法調用set方法設定age的值為5
	// 在這裡調用 set方法,因為沒有,是以編譯器在編譯時自動生成了。
	d.age = 5;
	// 因為自己自定義了get方法,是以Xcode尊重使用者的選擇,請注意輸出結果。
	NSLog(@"%d", d.age);
	return 0;
}
           

id

id 是一種類型,萬能指針,能夠指向\操作任何的對象。 注意:在id的定義中,已經包好了*号。id指針隻能指向os的對象。 id類型的定義 Typedef struct objc object{ Class isa; }*id; 局限性:調用一個不存在的方法,編譯器會馬上報錯。