2011-09-18 27 views
3

可能重複:
Property Declaration and Automatic Backing Storage Allocation的iOS - 目標C - 關於產品性能

我是相當新的Objective-C和我想問一個基本問題。我試圖找出什麼是以下兩個例子之間的區別:

@interface MyViewController : UIViewController { 

     UIImageView *myImageView; 
    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

和:

@interface MyViewController : UIViewController { 

    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

什麼是正確的做法?我知道使用屬性和屬性的含義。問題是第一個例子和第二個例子有什麼不同?記憶有差異嗎?

由於提前,

安德烈亞斯

+0

等等。請做一個搜索 - 這裏有很多關於這個已經可用的好信息:http://stackoverflow.com/search?page=2&tab=relevance&q=%5bobjc%5d%20declare%20ivar%20property –

回答

8

第一個示例使用明確的支持該屬性的變量。即:您已經定義了支持變量並可以直接訪問它。

在第二個示例中,Objective-C 隱式地爲創建了備用變量。既然你不知道它的名字,你不能直接訪問它。

但是,你能不能告訴Objective-C的如何命名:

@synthesize myImageView = myImageViewVariable; 

現在,您可以直接訪問myImageViewVariable。如果你想使用不同的支持變量,你也可以使用相同的語法。例如,我更喜歡這樣做:

@interface Foo : NSObject { 
    Bar *baz_; 
} 

@property (nonatomic, retain) Bar *baz; 
@end 

@implementation Foo 
@synthesize baz = baz_; 
@end 

這是一個有趣的問題,我只是想爲支持變量指定一個不同的名稱。我不需要明確地聲明,但我不喜歡隱式操作。

+0

這裏的例子什麼是myImageViewVariable?我的意思是我有myImageView,你用myImageViewVariable實例化它。爲什麼然後你訪問myImageViewVariable而不是myImageView這是你的財產? – andreasv

+0

在我的示例中,您可以訪問屬性('self.myImageView'),也可以直接訪問支持變量('myImageViewVariable')。 – DarkDust

+0

訪問屬性的好處在於,當你繼承子類時,它更加健壯,像保留這樣的事情得到了照顧。訪問支持變量的速度稍微快一些(沒有方法調用完成),但缺點是當你繼承子類時它是有問題的,而且你還需要自己完成內存管理。混合訪問方法是OK的,順便說一句。像:'self.property = newObject; [self doSomething:propertyBackingVariable];' – DarkDust

2

第二種方法使用動態的ivars。請參閱這篇大文章:http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html

+0

所以清除一些東西。 。就我所理解的文章而言,第二種方法尤其適用於在類之間有多重繼承的情況。如果我在上面的例子中顯示的控制器是最後一個孩子,那麼正確的方法是什麼......我從我的理解中認爲它們都是相同的! – andreasv

+0

...只要您不想編寫向後兼容的代碼,就認爲它們相同。 – vikingosegundo

+0

蘋果是否對iPhone應用程序提交的這些方法有任何擔憂?我的意思是說有沒有辦法可以導致拒絕,我應該遵循特定的模式? – andreasv

1

第二個需要現代化的運行 - 這是iOS和64位Mac OS X

當你@synthesize在執行的財產,可以定義後備存儲。