我有点顽固,但我想了解弱弱和强烈的参考,所以这就是为什么我再次问你.
考虑一下:
__weak NSString* mySecondPointer = myText;
NSLog(@"myText: %@", myText);
Run Code Online (Sandbox Code Playgroud)
结果是myText: (null)非常明显的 - 弱引用在赋值后设置为null,因为没有对尖头对象的强引用.
但在这种情况下:
__strong NSString* strongPtr = [[NSString alloc] initWithFormat:@"mYTeSTteXt %d"];
// weak pointer points to the same object as strongPtr
__weak NSString* weakPtr = strongPtr;
if(strongPtr == weakPtr)
NSLog(@"They are pointing to the same obj");
NSLog(@"StrongPtr: %@", strongPtr);
NSLog(@"weakPtr: %@", weakPtr);
NSLog(@"Setting myText to different obj or nil");
// after line below, there is no strong referecene to the created object:
strongPtr = [[NSString alloc] …Run Code Online (Sandbox Code Playgroud) weak-references reference-counting objective-c strong-references
鉴于此代码:
// Initialize string
NSString *name = @"Franzi";
Run Code Online (Sandbox Code Playgroud)
@""宏创建一个带有给定文本的NSString(这里名称为Franzi)和一个RETAIN COUNT OF 1?
所以@""给出了一个必须被释放的NSString?我对这个对象负责吗?第二个代码示例然后让我感到困惑,即使我这样使用它:
NSSting *message;
message = [NSString stringWithFormat:@"Hello @%!",name];
//message = [NSString stringWithFormat:@"Hello Girl!"];
Run Code Online (Sandbox Code Playgroud)
因此消息在下一个运行循环中释放,k.但是作为stringWithFormat的参数给出的NSString是什么?
类对象NSString是否释放了作为争论的NSString @"Hello%@"/ @"Hello Girl"?或@"" - Konstruktor只回馈自动释放的NSStrings?
我有一个UItableView,由10个元素组成.我打开了仪器以捕获内存泄漏,当我滚动tableView时,它开始泄漏内存.在仪器中我试图找到哪个导致泄漏但无法弄清楚,它说"_NScontiguousstring"表示整个泄漏.
我找到了Objective-C的一些解决方案,他们在"CellForRowAt"函数中检查了单元格是否为nil.我不认为它对Swift有用,但我试过并且按预期它不起作用.
我的问题是什么会导致这种内存泄漏?
我测试的设备;
iPhone X on 11.3.1
iPhone 6 11.2.5控制器类;
class TableViewController: UITableViewController {
let teamModel = TeamModel(uid: "adsada", name: "First Team ", idea: "idea 1", slogan: "Slogan 1", university: "dasda", image: "info", isActive: true)
let teamModel2 = TeamModel(uid: "adsada", name: "Team 2", idea: "idea 2", slogan: "adasd", university: "dasda", image: "info", isActive: true)
let teamModel3 = TeamModel(uid: "adsada", name: "Team 3", idea: "idea 3", slogan: "adasd", university: "dasda", image: "info", isActive: true)
let teamModel4 = TeamModel(uid: "adsada", …Run Code Online (Sandbox Code Playgroud) 我一直在开发没有情节提要的新应用。一切正常,直到我使用Instruments测试我的应用程序:每次将字符串分配给标签时,该应用程序都会泄漏。当我使用情节提要时,我没有那样的漏洞。
我已阅读以下资源以找到答案:
最受欢迎的观点是这是一个Instruments错误,但对我来说似乎太明显了。
泄漏在空的应用程序中重现。在根视图控制器中:
class ViewController: UIViewController {
var label: UILabel?
override func viewDidLoad() {
super.viewDidLoad()
label = UILabel()
view.addSubview(label!)
var textForLabel: String? = "Hello"
label?.text = textForLabel
//attempt to free the memory
textForLabel = nil
label = nil
//EDIT: added after @J.Doe and @Sh-Khan answers, but it's still leaking
label.removeFromSuperview()
}
}
Run Code Online (Sandbox Code Playgroud)
在真实设备(iPhone SE 11.2)上的Instruments中测试此应用时,我看到以下内容:
单击_NSContiguousString时,我看到[UILabel setText:]中出现内存泄漏。
我试图将标签设置为弱,但是当我尝试将其添加为子视图时,它变为零。
因此,我的问题是:
我是iOS开发的新手,所以我认为我缺少明显的东西。我将不胜感激任何帮助或建议。
编辑:根据@ Sh-Khan和@ J.Doe的 …
我有以下示例类:
Test.h:
@interface Test : UIButton {
NSString *value;
}
- (id)initWithValue:(NSString *)newValue;
@property(copy) NSString *value;
Run Code Online (Sandbox Code Playgroud)
Test.m:
@implementation Test
@synthesize value;
- (id)initWithValue:(NSString *)newValue {
[super init];
NSLog(@"before nil value has retain count of %d", [value retainCount]);
value = nil;
NSLog(@"on nil value has retain count of %d", [value retainCount]);
value = newValue;
NSLog(@"after init value has retain count of %d", [value retainCount]);
return self;
}
Run Code Online (Sandbox Code Playgroud)
其中产生以下输出:
2008-12-31 09:31:41.755 Concentration[18604:20b] before nil value has retain count of 0
2008-12-31 09:31:41.756 …Run Code Online (Sandbox Code Playgroud) 根据以下代码,请指教
NSString *str= [[NSString alloc] initWithString:@"Hello world"];
NSLog(@"Length: %lu\n", [str length]); // 11
NSLog(@"Retain count is %lu\n", [str retainCount]); //1152921504606846975
[str release];
NSLog(@"%lu\n", [str length]); // 11
NSLog(@"Retain count is %lu\n", [str retainCount]); //1152921504606846975
Run Code Online (Sandbox Code Playgroud)
最初我想知道为什么数字这么大但后来看到一个帖子解释它.试问,而不是...为什么这个号码改成我大大是否使用%dVS %lu.最初,我使用过%d,但得到一个警告,说" 转换指定类型int但参数的类型为NSUInteger(也就是unsigned long).修复是%d改为%lu"
为什么保留计数不减少?str发送后,大数字仍然显示不变release
为什么我str发送后仍能访问release?
可能重复:
NSString保留Count
是否有可能任何对象的保留计数为负值?
我有这个代码
NSString *str = [[NSString alloc] initWithString:@"Hello World"];
NSLog(@"String Retain Count: %i", [str retainCount]);
Run Code Online (Sandbox Code Playgroud)
这将返回保留计数 -1.
为什么会这样?
我也是这样做的
NSString *str = [[NSString alloc] init]
Run Code Online (Sandbox Code Playgroud)
仍然是保留计数中的返回负值.
这是怎么回事?
请帮忙了解这件事!!!!!
为什么此代码显示保留值大于1?为什么它是2147483647?
NSString *data22 = [[NSString alloc] initWithString:@"fsdfsfsdf"];
int a = [data22 retainCount];
NSLog(@"retain count 1== %d ====" ,a);
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是
retain count 1== 2147483647 ====
Run Code Online (Sandbox Code Playgroud) 请解决这个问题.
NSString *S1 = @"abc";
//retain count of s1 ??
NSString *S2 = [S1 copy];
//retain count of s2 and s1 ??
NSString *S3 = [S2 copy];
//retain count of s3 and s2 ??
NSString *S4 = [S3 retain];
//retain count of s4 and s3 ??
NSString *S1 = @"xyz";
//retain count of s1, s2, s3 and s4 ??
Run Code Online (Sandbox Code Playgroud)
不建议retainCount因为我认为没有给出确切的结果.
objective-c ×7
ios ×4
iphone ×2
memory-leaks ×2
retaincount ×2
swift ×2
xcode ×2
autorelease ×1
cocoa ×1
cocoa-touch ×1
copy ×1
uilabel ×1
uitableview ×1