[英]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.