簡體   English   中英

Objective-C的差異

[英]Objective-c Differences

在.h或.m文件中聲明@property有什么區別

@property (nonatomic, readwrite, assign) BOOL notificationDidLaunch;

與變量的范圍有關嗎?

同樣在.h文件中,像這樣用brickt聲明字符串之間有什么區別

@interface AppDelegate : NSObject < UIApplicationDelegate > {
    NSString *hat;
}

並像下面這樣在他們外面做

@property (nonatomic, strong) NSString *hat;

簡要說明

一個@property的.M里面是私有的類,並在.H是公開的。

聲明內部方括號或不使用方括號的區別在於變量的含義。

在方括號內,您可以聲明一個實例變量 (或ivar),該變量 只能由您的類的實例訪問。 屬性(在.h中聲明)意味着任何類都可以使用。

屬性

@property本質上定義了可以覆蓋的集合和獲取。 當您這樣做時:

AppDelegate myAppDelegate;
myAppDelegate.hat = @"A hat": 

您正在做的是:

[myAppDelegate setHat:@"A hat"]

而當你這樣做

myAppDelegate.hat //so you can get the property's value

你在做特別

[myAppDelegate hat]

覆蓋集和獲取

當您執行@synthesize hat = _hat您實際上是在創建一個具有關聯的實例變量_hat的get和set。 此實例變量僅應在您的獲取/設置中訪問,甚至在類內部也應使用您的設置/獲取(使用self.property

您可以通過@synthesize覆蓋以下方法來覆蓋該集合並創建它:

- (void) setHat:(NSString*) aHat
- (NSString *) hat

正如Tiago所說,將@property聲明放在.m(實現)文件的類擴展中是一種使屬性私有的方法,因此只有類本身可以訪問它。 在.h(公共接口文件)中聲明時,所有導入該.h文件的代碼均可見。 請記住,@ properties實際上只是聲明和合成訪問器方法的便利,並且與Objective-C中的所有方法一樣,它們從來都不是真正的私有。 最好的選擇是編譯器警告,如果您嘗試在另一個類中使用非公共方法,則沒有公共接口會聲明該方法。

對於問題的第二部分,這聲明了一個名為myString的實例變量(“ ivar”):

@interface MyClass : NSObject
{
    NSString *myString;
}

雖然這聲明了一個名為myString的屬性:

@property NSString *myString;

實例變量和@property之間的區別比僅僅說一個ivar僅可通過您的類的實例訪問更重要。 聲明一個ivar會將變量添加到內存中類的結構中。 相反,@properties在類上聲明/定義方法 默認情況下,這些方法設置/獲取關聯的和類似命名的ivar的值,但這不是必需的,對於@property擁有不直接訪問ivar的方法,這是完全可以接受的並且很普遍。 舉例說,一個類具有一個以_firstName_lastName ivars為后盾的firstName和lastName屬性,以及一個僅將firstName和lastName getter方法返回的值連接在一起的第三fullName屬性(和/或在其設置方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM