作为参数的变量的内存管理

时间:2012-02-28 22:20:03

标签: iphone objective-c memory-management

我正在为框架编写一个插件类。

我的界面定义如下:

@interface Blah : NSObject<SomeDelegate> 
{
    @private 
        NSString* _callbackID;
}

我有一个私有成员变量,因为框架将在我的类中调用一个方法,向它传递一个包含NSString的数组,这是后续调用中另一个方法所需要的。我不希望它在课外可见。

在第一个被调用的方法中,我正在做这样的事情:

- (void) blah:(NSArray*)blahArray 
{
    _callbackID = [blahArray objectAtIndex:0];
    MyViewController *vc = [[MyViewController alloc] init];
    vc.someDelegate = self;
    [self.viewController presentModalViewController:vc animated:YES];
    [vc release];
}

作为委托,我的插件Blah类将从MyViewController收到一个回调,它需要使用此_callbackID。

  1. 我是否正确处理私有变量,我是否正确地为其分配值?
  2. 我知道我不应该从NSString管理blahArray,因为我没有创建它是正确的吗?
  3. 如果对blah的调用是异步的,那么什么会阻止NSArray在对象调用blah中被清除而在_callbackID中没有任何内容?我怎么知道这种情况呢?
  4. 如果NSString _callbackID被分配给不在调用blah的类控制下的现有对象,是否必须复制它以确保调用类没有清理它?< / LI>

2 个答案:

答案 0 :(得分:2)

_callbackID = [[blahArray objectAtIndex:0] copy];

在你的dealloc里面:

-(void)dealloc
{
  [_callbackID release];
  [super dealloc];
}

这样,你不关心所有者对这个对象做了什么。通常,您应该始终创建字符串的副本,因为字符串可能是NSMutableString并且可能会更改。如果要保留当前值,请始终使用“复制”而不是“保留”。

答案 1 :(得分:2)

<强> 1。我是否正确处理私有变量,我是否正确地为其分配值?

您可以通过始终使用属性来让自己更轻松。将其添加到您的界面(大括号外):

@property (nonatomic, copy) NSString *_callbackID;

然后让编译器自动生成get / set方法,方法是将其添加到您的实现中:

@sythesize _callbackID;

然后你可以写:

self._callbackID = [blahArray objectAtIndex:0];

透明地调用自动生成的set_callbackID方法,该方法将复制值(由于属性描述符中的copy提示)。

<强> 2。我明白我不应该从blahArray管理NSString,因为我没有创建它是正确的吗?

您不负责发布它,但如果您想保留它,则需要retaincopy它。一旦你这样做,你就有责任释放它(参见Gilad的答案)。

第3。如果对异常的调用是异步的,那么什么会阻止NSArray在对象调用中被清除,而在_callbackID中什么都没有留下来?我怎么知道这种情况呢?

到目前为止,您可能已经意识到,如果没有retaincopy,变量可能会在您使用时释放。这就是为什么你需要把它变成你自己的原因。你会知道变量是否从你下面释放出来,因为你的应用程序会因为EXC_BAD_ACCESS而崩溃; - )。

<强> 4。如果然后将NSString _callbackID分配给不受类调用的现有对象,则必须复制它以确保调用类没有清除它?

是。如果你想确保一个变量在你的函数期间保持不变,你可以写[[myVar retain] autorelease]。然后它会在运行循环结束时自动释放(或者当前自动释放池耗尽时)。