有效地,对象级别或本地方法声明和释放对象?

时间:2009-10-11 22:27:59

标签: iphone objective-c memory-management

除了对象的不同方法的对象范围可能需要使用这样的对象之外,是否有一个原因:

@interface
...
ViewMgmtAppDelegate : NSObject <UIApplicationDelegate> {
Obj *obj1;
...
}
@end

@implementation
- (void)applicationDidFinishLaunching:(UIApplication *)application {
obj1 = [Obj alloc];
[window addSubview:obj1]; 
...
}
- (void)dealloc {
[obj1 release];
...
}
@end

而不是:

@interface
...
ViewMgmtAppDelegate : NSObject <UIApplicationDelegate> {
...
}
@end

@implementation
- (void)applicationDidFinishLaunching:(UIApplication *)application {
Obj obj1 = [Obj alloc];
[window addSubview:obj1]; 
[obj1 release];
...
}
- (void)dealloc {
...
}
@end

哪种方式更有效率?

任何帮助赞赏//:)

3 个答案:

答案 0 :(得分:1)

如果在视图加载完成后将使用obj1,您将使用第一个示例。例如,在点击事件之后。

如果不是这种情况,将使用第二个例子。因此在发布后不再需要Obj1,也不需要使用iPhone的RAM。

答案 1 :(得分:1)

我假设您在询问是否应该在addSubview之后或dealloc之后发布对象。

这取决于应用程序逻辑以及addSubview的作用。如果addSubview保留了对象,则可以在通话后立即将其释放,如果您在其他对象中不需要它。

window完成它并释放将被释放的对象时,如果没有其他对象持有对它的引用。

如果另一方面你保留引用,直到你的对象被释放,那么对象将会一直存在,直到你的对象被释放为止。

如果您不需要,请立即释放。

顺便说一下,创建和实例的正确方法是调用:

Obj * o = [[Object alloc] init]

Alloc分配内存,init(或任何其他init ...方法)初始化对象(我相信)。

答案 2 :(得分:1)

如果该对象仅由该方法使用,则它应该是局部变量并在该方法中释放(如第二个示例中所示)。如果它是其他方法使用的类的属性,则应将其存储在实例变量中,并在拥有对象消失时释放(如第一个示例中所示)。