我正在为框架编写一个插件类。
我的界面定义如下:
@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。
NSString
管理blahArray
,因为我没有创建它是正确的吗?NSArray
在对象调用blah
中被清除而在_callbackID中没有任何内容?我怎么知道这种情况呢?_callbackID
被分配给不在调用blah
的类控制下的现有对象,是否必须复制它以确保调用类没有清理它?< / LI>
醇>
答案 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,因为我没有创建它是正确的吗?
您不负责发布它,但如果您想保留它,则需要retain
或copy
它。一旦你这样做,你就有责任释放它(参见Gilad的答案)。
第3。如果对异常的调用是异步的,那么什么会阻止NSArray在对象调用中被清除,而在_callbackID中什么都没有留下来?我怎么知道这种情况呢?
到目前为止,您可能已经意识到,如果没有retain
或copy
,变量可能会在您使用时释放。这就是为什么你需要把它变成你自己的原因。你会知道变量是否从你下面释放出来,因为你的应用程序会因为EXC_BAD_ACCESS而崩溃; - )。
<强> 4。如果然后将NSString _callbackID分配给不受类调用的现有对象,则必须复制它以确保调用类没有清除它?
是。如果你想确保一个变量在你的函数期间保持不变,你可以写[[myVar retain] autorelease]
。然后它会在运行循环结束时自动释放(或者当前自动释放池耗尽时)。