2013-10-14 55 views
2

我想分配一個NSObject到自己的虛擬內存頁面上。這可能嗎?如果我們仍然可以使用NSZone s似乎微不足道,但它們已被棄用。我嘗試使用NSZoneFromPointer,但它總是返回nil。據Tips for Allocating Memory如何在iOS中將NSObject分配到其自己的虛擬內存頁面?

對於大內存分配,在大是什麼比幾 虛擬內存頁面的詳細,malloc的自動使用vm_allocate 程序來獲得請求的內存。

因此,好像我應該能夠只是讓我的對象一樣大,正是如此幾頁:

@interface MyObject : NSObject { 
int[40960]; // 4096 is the default page size, so this is 10 pages. 
} 

@implementation MyObject 
@end 

我意識到這是一個黑客,但它會一直工作嗎?有沒有更好的辦法?

+1

你爲什麼想這樣做? – CouchDeveloper

+1

如何讓一個對象佔用多個頁面與將它放在特定頁面上有關?是你想要它在自己的網頁上,而且你不關心哪一個,或者你想要它在你選擇的特定頁面上? –

+0

已編輯。感謝您指出@LoyalTingley的糟糕措辭。 –

回答

2

twitter

objc_constructInstance(...)可以讓你做你想要的...

<objc/runtime.h>

/** 
* Creates an instance of a class at the specific location provided. 
* 
* @param cls The class that you wish to allocate an instance of. 
* @param bytes The location at which to allocate an instance of \e cls. 
* Must point to at least \c class_getInstanceSize(cls) bytes of well-aligned, 
* zero-filled memory. 
* 
* @return \e bytes on success, \c nil otherwise. (For example, \e cls or \e bytes 
* might be \c nil) 
* 
* @see class_createInstance 
*/ 
OBJC_EXPORT id objc_constructInstance(Class cls, void *bytes) 
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0) 
    OBJC_ARC_UNAVAILABLE; 

看起來objc_constructInstance就是答案。

+0

很高興這個答案指出你在正確的方向。那麼您可以像訪問期望的那樣捕獲異常訪問?邪惡但整齊。 :) – Dad

+0

我在頁面中創建對象,然後將頁面轉換爲只讀並在預期的地址上觸發EXC_BAD_ACCESS,但從中恢復看起來不太有希望。不過,這是一個有趣的練習。 –

+0

如果你想要這個答案的代表,請隨意複製粘貼它,我會刪除我的。 –

-2

我不認爲作爲一個用戶級應用程序,你應該有任何控制虛擬內存分配。 iOS中的應用程序位於沙箱中。

+0

您可以在iOS應用程序中調用vm_allocate。我不確定應用沙盒與它有什麼關係。現代Objective-C運行庫在OSX上存在同樣的問題。 –

相關問題