簡體   English   中英

ARC禁止自動發布嗎?

[英]ARC forbids autorelease?

ios的新增功能,並嘗試從函數返回NSString。 據我了解,我需要[NSString... alloc] init]以便創建返回的字符串。 另外,由於我調用了alloc ,我想我必須自己自動釋放對象,但是我收到消息“ ARC禁止顯式消息發送“自動釋放””,所以..我如何告訴ios完成分配的對象后如何NSString?

- (NSString *) generateUID
{
    char foo[32];
    // create buffer of all capital psuedo-random letters
    for (int i = 0; i < sizeof(foo); i++)
       foo[i] = (random() % 25) + 65; // 0-25 + CAPITAL_A

    NSString *uid = [[NSString alloc] initWithBytes:foo length:sizeof(foo) encoding:NSASCIIStringEncoding];
    NSLog (@"uid: %@", uid);
    return (uid);
}

ARC =自動引用計數=編譯器根據對代碼的分析來添加必要的版本和自動發布。 您當然看不到它,因為它發生在幕后。 正如sosbom在評論中提到的那樣,您確實應該閱讀Apple網站上的適用文檔

你不知道

在iOS 5之前,為了兼容起見,只有autorelease發布功能,您必須執行以下操作:

Thing *myThing = [[Thing alloc] init]; // Retain count: 1
[myArray addObject:myThing];           // Retain count: 2
[myThing release];                     // Retain count: 1

使用上面的代碼,將持有對象的責任賦予了數組,當刪除數組時,它將釋放其對象。

或在自動釋放的情況下。

- (MyThing*)myMethod
{
    return [[[MyThing alloc] init] autorelease];
}

然后,它將在對象到達NSAutoReleasePool時釋放該對象,並在耗盡后將其刪除。

ARC現在可以解決這個問題,它幾乎為您插入了丟失的部分,因此您不必擔心,它的優點是您可以從以下位置獲得引用計數的優勢(相對於垃圾收集器)增加執行ARC步驟的編譯時檢查的成本,但是您的最終用戶並不關心編譯時。

除此之外,您現在擁有strongweak (相對於他們的非ARC兄弟級retainassign ,后者對非保留項仍然有用),您將獲得良好的編程經驗,而不必花很多時間來追蹤代碼保留數在您的左手上。

簡短的答案是你不知道! ARC將為您處理內存管理。 當ARC打開時,編譯器將插入適當的內存管理語句,例如保留和釋放消息。

最好使用ARC,因為編譯器可以更好地了解對象的生命周期,並且不易出現人為錯誤。

關於ARC需要注意的另一件事。 ARC是一樣的傳統垃圾收集。 在后台沒有單獨的進程或線程在運行,例如java的GC,它在不再引用對象時刪除對象。 可以將ARC視為編譯時垃圾回收:)。

唯一需要注意的是引用循環和在Objective-C與Obj-C ++ / C之間的橋接指針/對象。 您可能要查找http://en.wikipedia.org/wiki/Weak_reference

希望這可以幫助

通常,您應該在類中定義一個構造函數方法,然后將alloc邏輯放入該方法中。 然后,由於alloc / init方法總是返回(id)且類型安全性不高,因此導致類型轉換錯誤要困難得多。 例如,像NSS​​tring這樣的內置類就可以做到這一點,例如[NSString stringWithString:@“ foo”]。 這是一個不錯的小塊代碼,您可以用來編寫適用於較舊的非弧形編譯和啟用了arc的代碼。

+ (AVOfflineComposition*) aVOfflineComposition
{
  AVOfflineComposition *obj = [[AVOfflineComposition alloc] init];
#if __has_feature(objc_arc)
  return obj;
#else
  return [obj autorelease];
#endif // objc_arc
}

然后,您聲明方法並創建對象的實例,如下所示:

AVOfflineComposition *obj = [AVOfflineComposition aVOfflineComposition];

最好使用上述方法,因為它是類型安全的,並且與arc和non-arc的代碼相同。 如果您嘗試將返回的對象分配給其他類型的變量,則編譯器會抱怨。

暫無
暫無

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

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