Iphone 单例对象内存管理
在我的代码中,我使用单例对象作为我的应用程序的中心点来加载和缓存应用程序经常需要的图像,因此我不必每次加载图像时都进行资源密集型内存分配 但在我的应用程序执行过程中,有时内存使用会变得非常频繁,我希望释放缓存的图像数据。目前,当我收到内存警告时,我刚刚从我的singleton中释放UIImage实例Iphone 单例对象内存管理,iphone,memory-management,singleton,Iphone,Memory Management,Singleton,在我的代码中,我使用单例对象作为我的应用程序的中心点来加载和缓存应用程序经常需要的图像,因此我不必每次加载图像时都进行资源密集型内存分配 但在我的应用程序执行过程中,有时内存使用会变得非常频繁,我希望释放缓存的图像数据。目前,当我收到内存警告时,我刚刚从我的singleton中释放UIImage实例 但是,我更希望能够释放整个singleton对象。可能吗?如果是这样,怎么做?您创建的任何对象都可以随时释放。(假设您创建了它并设置了它的属性。) 创建的任何对象都可以随时释放。(假设您创建了它并设
但是,我更希望能够释放整个singleton对象。可能吗?如果是这样,怎么做?您创建的任何对象都可以随时释放。(假设您创建了它并设置了它的属性。)
创建的任何对象都可以随时释放。(假设您创建了它并设置了它的属性。)
当然是。尽管与图像相比,该对象的内存使用量很可能可以忽略不计 根据单例的性质,您需要为其设置访问器,如果当前不存在,您将在其中创建它:
+ (MySingletonClass*) mySingleton
{
if ( mySingleton == nil )
{
mySingleton = [[MySingletonClass alloc] init];
}
return mySingleton;
}
您只需添加另一个要销毁时调用的文件:
+ (void) destroyMySingleton
{
[mySingleton release];
mySingleton = nil;
}
如果你把它放在其他地方,你会有麻烦;不要那样做。如果从多个线程访问,则需要同步。否则,它非常简单——getter将在您下次需要它时重新创建。当然是这样。尽管与图像相比,该对象的内存使用量很可能可以忽略不计 根据单例的性质,您需要为其设置访问器,如果当前不存在,您将在其中创建它:
+ (MySingletonClass*) mySingleton
{
if ( mySingleton == nil )
{
mySingleton = [[MySingletonClass alloc] init];
}
return mySingleton;
}
您只需添加另一个要销毁时调用的文件:
+ (void) destroyMySingleton
{
[mySingleton release];
mySingleton = nil;
}
如果你把它放在其他地方,你会有麻烦;不要那样做。如果从多个线程访问,则需要同步。否则,它非常简单——getter将在您下次需要时重新创建它。下面是我正在使用的OpenAL代码的单例访问器示例
// Eric Wing. Singleton accessor. This is how you should ALWAYS get
// a reference to the sound controller. Never init your own.
+ (OpenALSoundController*) sharedController
{
static OpenALSoundController* shared_sound_controller;
@synchronized(self)
{
if (nil == shared_sound_controller)
{
shared_sound_controller = [[OpenALSoundController alloc] init];
}
}
return shared_sound_controller;
}
OpenAL需要一段时间来加载,所以保留一个实例正是我所需要的。有多个线程在运行(目前不是我的情况,但我希望我的代码被移植到这种情况下),我锁定了self
@synchronized(self)
正是这样做的
现在我分配了内存,所以我负责释放它。我可以在
+sharedController
访问器方法中调用[shared\u sound\u controller autorelease]
,但这可能会提前释放控制器,特别是当我有多个线程,并且我第一次在非主线程的线程中调用访问器时。下面是我正在使用的OpenAL代码的单例访问器示例
// Eric Wing. Singleton accessor. This is how you should ALWAYS get
// a reference to the sound controller. Never init your own.
+ (OpenALSoundController*) sharedController
{
static OpenALSoundController* shared_sound_controller;
@synchronized(self)
{
if (nil == shared_sound_controller)
{
shared_sound_controller = [[OpenALSoundController alloc] init];
}
}
return shared_sound_controller;
}
OpenAL需要一段时间来加载,所以保留一个实例正是我所需要的。有多个线程在运行(目前不是我的情况,但我希望我的代码被移植到这种情况下),我锁定了self
@synchronized(self)
正是这样做的
现在我分配了内存,所以我负责释放它。我可以在
+sharedController
访问器方法中调用[shared\u sound\u controller autorelease]
,但这可能会提前释放控制器,特别是当我有多个线程,并且我第一次在一个非主线程的线程中调用访问器时。你确定这也适用于单例对象吗?我不是。我不明白为什么不会,但我不确定。实际上,单例对象何时会从内存中释放?你确定这也适用于单例对象吗?我不确定。我不明白为什么它不会,但我不确定。实际上,当那个单例对象从内存中释放出来时?很酷,谢谢!关于singleton的内存使用率非常低,你是对的,但是我发现只编写[mySingleton release]
而不是创建一个像[mySingleton releaseMagageData]
@ryyst这样的新方法就不那么令人困惑了。好吧,你仍然需要编写一个新方法——类destroy
方法。我想你可以破解它,dealloc
将静态单例重置为nil
,但那真的很糟糕。酷,谢谢!关于singleton的内存使用率非常低,你是对的,但是我发现只编写[mySingleton release]
而不是创建一个像[mySingleton releaseMagageData]
@ryyst这样的新方法就不那么令人困惑了。好吧,你仍然需要编写一个新方法——类destroy
方法。我想你可以破解它,这样dealloc
将静态单例重置为nil
,但那将非常糟糕。如果它来自web,你可以查看afnetworking uiimageview类别如果它来自web,你可以查看afnetworking uiimageview类别