例如,我有一个UIViewController,并且有一个值:
NSString *testString;
@property (nonatomic, retain) NSString *testString;
<。>中的:
@synthesize testString;
这两行代码之间有什么不同:
testString = @"something";
self.testString = @"something";
答案 0 :(得分:1)
第一种情况为testString
分配了新值,您正在直接访问testString
:
testString = @"something";
在第二种情况下:
self.testString = @"something";
您通过调用setter
来调用@synthesize testString
,并确认它是属性。
第二种情况调用生成的[aUIViewControllerObject setTestString: @"something"]
,其中保留@"something"
NSString
(因为testString
属性声明为retain
参数),旧的值为autoreleased
或released
,新值已分配给testString
。
答案 1 :(得分:0)
self.testString = @"something";
隐式调用setTestString:
方法。在您的情况下,它意味着:
-(void) setTestString: (NSString*) newString
{
if (testString != newString)
{
[testString release];
testString = [newString retain];
}
}
答案 2 :(得分:0)
retain
或copy
,则非ARC代码中的会有很大差异。在这两种情况下,当你拨打self.property
时,幕后会有更多的事情发生。非常简单,retain
做了类似的事情:
- (void)setFoo:(NSString *)newFoo {
[newFoo retain];
[foo release];
foo = newFoo;
}
并且复制它就像是:
- (void)setFoo:(NSString *)newFoo {
NSString *oldFoo = foo;
foo = [newFoo copy];
[oldFoo release];
}
}