2011-03-21 68 views
4

我對Objective-C非常陌生。我知道C和C++,但Objective-C有相當的學習曲線。無論如何,有一個較短的方法(可能通過某種NSNumber的文字,如果這種存在的)編寫如下:NSNumber Literals

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]]; 
+0

對於那些想知道的人來說,Tyler是我創建的人類的一個實例。 – 2011-03-21 04:19:16

回答

6

是的,只是使用的許多輔助功能,如numberWithInt:之一:

[Tyler setArms:[NSNumber numberWithInt:1]]; 

表達式[NSNumber numberWithInt:1]相當於[[[NSNumber alloc] initWithInt:1] autorelease],相當於[[[NSNumber alloc] autorelease] initWithInt:1]。後者的表達非常罕見。

+0

我不知道是否在將對象告知自動釋放之前或之後初始化對象。謝謝。 :) – 2011-03-21 04:25:03

+1

後一個表達式不僅不常見,而且完全不正確!對於那些'-init *'方法返回的東西不是首先分配的東西的類(比如說每個NSString曾經實例化過),它都會完全破壞。 – bbum 2011-03-21 04:49:46

3

您不必分配和初始化,NSNumber提供了一個方便的方法來做到這一點:

第一:除了以往的迴應,這兩者都是正確

[Tyler setArms:[NSNumber numberWithInt:1]]; 
2

兩件事,如果遵循Cocoa命名約定,我們可以更容易地提供幫助:變量(包括對象指針)應該以小寫字母開頭。所以,'泰勒'而不是'泰勒'。類和類型以大寫字母開頭。

其次,在初始化它之前,你永遠不會自動釋放一個對象。總是先分配,然後是init,然後執行其他任何你需要做的事情,包括釋放或autorelease。

+0

啊,我甚至沒有意識到我使用了大寫字母T.它從來沒有發生過。謝謝。 – 2011-03-21 04:26:35

14

Clang v3.1開始,您現在可以使用Objective-C文字。

NSNumber *fortyTwo = @42;    // equivalent to [NSNumber numberWithInt:42] 
NSNumber *fortyTwoUnsigned = @42U; // equivalent to [NSNumber numberWithUnsignedInt:42U] 
NSNumber *fortyTwoLong = @42L;  // equivalent to [NSNumber numberWithLong:42L] 
NSNumber *fortyTwoLongLong = @42LL; // equivalent to [NSNumber numberWithLongLong:42LL] 

所以,回答您的具體問題:

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]]; 

目前可以寫爲:

​​

還有用於數組和字典文字,但它們超出範圍這個問題。

爲了充分利用Xcode中的文字,您至少需要版本4.4(在撰寫本文時,這只是預覽版)。

注:LLVM是一個開源項目,所以這沒有是受到蘋果公司的保密協議。

3

在Xcode的4.4現在有NSNumber的文字:

// integral literals. 
    NSNumber *fortyTwo = @42;    // equivalent to [NSNumber numberWithInt:42] 
    NSNumber *fortyTwoUnsigned = @42U; // equivalent to [NSNumber numberWithUnsignedInt:42U] 
    NSNumber *fortyTwoLong = @42L;  // equivalent to [NSNumber numberWithLong:42L] 
    NSNumber *fortyTwoLongLong = @42LL; // equivalent to [NSNumber numberWithLongLong:42LL] 

    // floating point literals. 
    NSNumber *piFloat = @3.141592654F; // equivalent to [NSNumber numberWithFloat:3.141592654F] 
    NSNumber *piDouble = @3.1415926535; // equivalent to [NSNumber numberWithDouble:3.1415926535] 

    // BOOL literals. 
    NSNumber *yesNumber = @YES;   // equivalent to [NSNumber numberWithBool:YES] 
    NSNumber *noNumber = @NO;    // equivalent to [NSNumber numberWithBool:NO] 

我見過的最好的文檔至今都在llvm man page

+0

我已經看到了使用Xcode 4的手冊頁。4現在用於我的項目,但IDE抱怨@YES不好 - 我檢查了標題,它仍然表示#define YES(BOOL)1,而不是__objc_yes。任何想法可能出現錯誤的更新? – themarketka 2012-08-03 21:18:04

+0

你好嗎?您的項目針對的是哪個版本的SDK? – drewish 2012-08-03 21:50:11

+0

基本SDK iOS 5.1,Xcode 4.4(4F250),部署目標iOS 5.0。它可能是iOS嗎? – themarketka 2012-08-07 11:29:09